我看到代码如
{{1}}
有人可以解释最后一行,定义x是什么意思?
答案 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: {}; }'.