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

nac*_*cab 6 typescript

假设我有一组有效的键名称

const validKeys = ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

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

interface MyObject {
  [key in validKeys]: number // for example
}
Run Code Online (Sandbox Code Playgroud)

Ale*_* L. 9

您可以使用const断言(在 typescript 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; }
Run Code Online (Sandbox Code Playgroud)

操场

如果您使用较旧的打字稿版本(> = 3.0),您可以添加小实用函数,它将参数转换为文字元组:

const tuple = <T extends string[]>(...args: T): T => args;
const validKeys = tuple('a', 'b', 'c'); // ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)