使用 Typescript 推断键名

Inferring key names with Typescript

以下代码在Visual Studio代码中运行良好:

type MyType = {
    id: number;
    name: string;
};

type MyTypes = { [name: string]: MyType }; 

const MY_TYPES:MyTypes = {
    ONE: { id: 0, name: 'name0' },
    TWO: { id: 1, name: 'name1' }
};

console.log(MY_TYPES.ONE); //Intellisense error
console.log(MY_TYPES['ONE']);

日志语句编译和输出相同的内容,但第一个在 VS Code 中生成错误并声明“属性 'ONE' 在类型上不存在”。我有没有其他方法来构建我的代码,以便 VS Code 可以自动 infer/autocomplete MY_TYPES 有 属性 个名字和两个?

如果您使用 indexed object,那么您只能使用索引访问属性:

type MyTypes = { [name: string]: MyType };
console.log(MY_TYPES["ONE"]);

那是因为编译器只知道对象有字符串类型的键,不知道具体的键。

如果您希望能够使用点表示法访问属性,那么您需要这样做:

type MyTypes = {
    ONE: MyType;
    TWO: MyType;
}
console.log(MY_TYPES.ONE);

但是您可以这样做:

type MyTypes = {
    ONE: MyType;
    TWO: MyType;
} 

const MY_TYPES = {
    ONE: { id: 0, name: 'name0' },
    TWO: { id: 1, name: 'name1' }
};

并且编译器将推断 MY_TYPES 的类型。