如何定义TypeScript接口属性名组成的数组类型?
解决方法
你需要用keyof操作符提取Details接口的属性名联合类型,再定义对应的数组类型,具体写法如下:
type RequiredFields = (keyof Details)[];
为什么之前的代码报错?
你写的{ [key in Details]?: string }是错误的——索引签名的key必须是string | number | symbol类型,而你直接用了整个Details接口类型,TypeScript自然会抛出类型不匹配的错误。keyof Details才会返回Details所有属性名的联合类型:"id" | "groups" | "name" | "total" | "open" | "debug" | "demo" | "registered",把这个联合类型作为数组元素类型,就完全符合你要的“任意属性名组成的数组”需求。
验证示例
下面的赋值都是合法的:
const fields1: RequiredFields = ['total', 'open', 'demo']; // 符合要求 const fields2: RequiredFields = ['id', 'name', 'registered']; // 同样合法
如果不小心写入接口外的属性名,TypeScript会直接报错拦截:
const invalidFields: RequiredFields = ['total', 'invalidKey']; // 报错:"invalidKey"不在keyof Details的范围内
内容的提问来源于stack exchange,提问作者mcclosa
相关产品推荐
相关产品推荐

