我可以检查是否存在字符串作为接口键吗
interface list { one: string two: string } const myNumber = "one"
如何检查myNumber值是否为接口键
euoag5mw1#
要做到这一点,你需要有一些东西让你在运行时获得接口的键。interface在运行时不存在-它纯粹是一个TypeScript构造,所以它不存在于发出的代码中。创建一个包含键的数组,声明它为as const,这样它就不会被自动加宽类型,然后你就可以将它转换为List类型。然后你就有了一个类型和一个运行时数组,你可以使用.includes检查:
interface
as const
List
.includes
const listKeys = ['one', 'two'] as const; type List = Record<typeof listKeys[number], string>; // ... const obj = { one: 'one', two: 'two', three: 'three' }; // Transformation to string[] needed because of an odd design decision: // https://github.com/Microsoft/TypeScript/issues/26255 const newObj = Object.fromEntries( Object.entries(obj).filter( ([key]) => (listKeys as unknown as string[]).includes(key) ) );
Playground链接
0mkxixxg2#
Typescript的类型不是值。因此,JavaScript的操作是不可能的。然而,在示例中,可以设置类型,使得myNumber是与键对应的类型。
interface list { one: string two: string } const myNumber: keyof list = "one"; // myNumber allow only "one" or "two";
blpfk2vs3#
你可以像这样使用typeguard函数,如果你有实现这个接口的对象:
interface List { one: string two: string } const list: List = { one: "some one" two: "some two" } function isListKey(value: string, list: IList): value is keyof List { return Object.keys(list).includes(value); }
3条答案
按热度按时间euoag5mw1#
要做到这一点,你需要有一些东西让你在运行时获得接口的键。
interface
在运行时不存在-它纯粹是一个TypeScript构造,所以它不存在于发出的代码中。创建一个包含键的数组,声明它为
as const
,这样它就不会被自动加宽类型,然后你就可以将它转换为List
类型。然后你就有了一个类型和一个运行时数组,你可以使用.includes
检查:Playground链接
0mkxixxg2#
Typescript的类型不是值。
因此,JavaScript的操作是不可能的。
然而,在示例中,可以设置类型,使得myNumber是与键对应的类型。
blpfk2vs3#
你可以像这样使用typeguard函数,如果你有实现这个接口的对象: