假设我有一个有效的键名数组
const validKeys = ['a', 'b', 'c']
如何创建仅接受这些键的对象类型?这不起作用:
interface MyObject {
[key in validKeys]: number // for example
}
答案 0 :(得分:2)
您可以使用const
断言(在打字稿3.4中添加)来保留数组项的文字类型:
const validKeys = ['a', 'b', 'c'] as const;
type Keys = (typeof validKeys)[number]; // "a" | "b" | "c"
type MyObject = { [key in Keys]: number } // { a: number; b: number; c: number; }
如果使用较早的打字稿版本(> = 3.0),则可以添加小型实用程序函数,该函数会将参数转换为文字的元组:
const tuple = <T extends string[]>(...args: T): T => args;
const validKeys = tuple('a', 'b', 'c'); // ["a", "b", "c"]
答案 1 :(得分:0)
如果您的validKeys
是静态的,则可以为其创建一个类型。然后从该类型中,可以设置对象键的类型。
您可以执行以下操作:
type ValidKeys = 'a' | 'b' | 'c'
type MyObject = {
[key in ValidKeys]?: number //You can remove ? if all the keys are mandatory
}
const validKeys: ValidKeys[] = ['a', 'b', 'c']
const obj: MyObject = {
a: 1,
b: 1,
c: 1
}
对象
obj
的键只能是ValidKeys之一。