TypeScript中如何获取接口内所有允许类型的联合类型
TypeScript获取接口所有属性类型联合的方法
完全可以实现,直接用TypeScript的索引访问类型就行,写法和取键名联合的keyof对应,格式为你的接口名[keyof 你的接口名]。
拿你举的Events接口举例:
interface Events { connect: () => void; message: (data: object) => void; } // 取所有属性值类型组成的联合 type EventValueTypes = Events[keyof Events]; // 得到的类型就是你要的:(() => void) | ((data: object) => void)
原理说明
keyof Events本身会返回键名的联合类型"connect" | "message",当联合类型被用作索引访问的参数时,TypeScript会自动遍历联合里的每一个键,取出对应位置的属性类型,最后把所有取出的类型重新合并成联合类型返回,刚好就是接口内所有定义的属性类型的集合。
可选属性的特殊情况
如果接口里有可选属性,最终返回的联合类型会自动带上undefined:
interface Test { name: string; age?: number; } type TestValues = Test[keyof Test]; // 结果是 string | number | undefined
如果要过滤掉undefined,可以配合内置的NonNullable工具类型使用:
type ValidTestValues = NonNullable<Test[keyof Test]>; // 结果为 string | number
内容的提问来源于stack exchange,提问作者echus
相关产品推荐
相关产品推荐

