以下语法是什么意思?

时间:2018-01-11 18:28:59

标签: typescript interface

我看到代码如

{{1}}

有人可以解释最后一行,定义x是什么意思?

3 个答案:

答案 0 :(得分:3)

这意味着SmartType可以使用string索引,值类型为any

interface SmartType {
    type: string;
    [x: string]: any;
}

let obj: SmartType = { type: 'Thing' };
obj['test'] = 'Hello World';
obj['test2'] = 10;
console.log(obj);

jsFiddle

打字稿手册在Interfaces: Indexable Types的部分解释了这一点。

答案 1 :(得分:2)

它没有定义x,它的作用是说SmartType的对象可以用string索引编入索引,存储在这些索引中的值是类型为any

const s: SmartType;
s['foo']; // -> any

x只是一个名字,我认为更多的是赋予键意义。任何其他名称都不会改变该行的含义。

答案 2 :(得分:1)

在其他答案中添加一些不明确的内容。以下TypeScript接口:

interface SmartType {
    type: string;
    [x: string]: any;
}

需要存在名为type且仅接受string类型值的键。

然后它指定任何其他键 可能 string并且它们可以保留any类型有价值的。但其他键也可以是数字

type可以保留string的唯一原因是string类型是any类型的子集(SmartType类型中的索引器类型{1}}界面)。

这就是为什么除了必需的type属性之外,您还可以在SmartType类型的对象中添加任意数量的包含任何类型值的属性。

const someSmartValue: SmartType = {
    type: 'some text',
    whatever: {},
    anyOtherTextProperty: ['array', 'containing', 'whatever', 1000, true, {a: () => false}],
    2: () => 'OK'
};

Check it on TypeScript Playground

将索引器的返回值更改为boolean会导致定义无效:

interface InvalidType {
    type: string; // [ts] Property 'type' of type 'string' is not assignable to string index type 'boolean'.
    [index: string]: boolean;
}

使用SmartType接口,以下内容也是非法的,因为特别需要名为type的密钥:

const anotherSmartValue: SmartType = {
    someProp: {}
}; // [ts] Type '{ someProp: {}; }' is not assignable to type 'SmartType'. Property 'type' is missing in type '{ someProp: {}; }'.