打字稿手册有以下例子:
// Validators to use
let validators: { [s: string]: StringValidator; } = {};
validators["ZIP code"] = new ZipCodeValidator();
正在做:
let validators: { [s: string]: StringValidator; } = {};
与:
相同let validators = {};
validators["s"] = new StringValidator();
如果您可以详细说明语法如何工作的详细信息。
答案 0 :(得分:3)
正在做:
let validators: { [s: string]: StringValidator; } = {};
与:
相同let validators = {}; validators["s"] = new StringValidator();
不,let validators: { [s: string]: StringValidator; } = {};
与let validators = {};
不同。
什么
let validators: { [s: string]: StringValidator; } = {};
正在做的是声明一个带有类型的标识符。您使用上述代码说的是:"我宣布标识符为validators
,此对象的类型可以包含string
,s
作为对象的键(请记住,javascript对象只是键值对),每个键的值都是StringValidator
类型。
如果删除类型注释(:
右侧的任何内容),则不为对象提供类型。
当您在vs代码中突出显示声明时,可以观察到差异。如果添加类型注释,您将获得{ [s: string]: StringValidator; }
类型,但如果删除它,则会获得any
,这意味着该对象可以是任何'任何&#39} ;类型。
答案 1 :(得分:1)
不,他们不一样。
第一个
let validators: { [s: string]: StringValidator; } = {};
声明一个名为validators
的变量,其类型为{ [s: string]: StringValidator; }
,其值为{}
。此类型意味着可以通过键(字符串)索引validators
以生成StringValidator
的实例。请注意,s
是一个“虚拟”变量,其实际名称没有运行时效果;该名称仅用于记录索引器的含义。
请注意,没有StringValidator
对象被实例化。 validators
的最终值是一个空对象。
第二个
let validators = {};
validators["s"] = new StringValidator();
首先声明一个名为validators
的变量,其类型推断为{}
(没有属性的对象),其值为{}
。然后它实例化StringValidator
对象并将结果分配给s
的{{1}}属性。
validators
的最终值是一个具有名为validators
的属性的对象,该属性引用s
对象。