如何在Typescript中将对象的键限制为数组的字符串?

时间:2019-04-08 09:54:43

标签: typescript

假设我有一个有效的键名数组

const validKeys = ['a', 'b', 'c']

如何创建仅接受这些键的对象类型?这不起作用:

interface MyObject {
  [key in validKeys]: number // for example
}

2 个答案:

答案 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; }

Playground

如果使用较早的打字稿版本(> = 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之一。