让验证者:{[s:string]:StringValidator; } = {};和......一样吗?

时间:2017-04-13 23:40:52

标签: typescript

打字稿手册有以下例子:

// Validators to use
let validators: { [s: string]: StringValidator; } = {};
validators["ZIP code"] = new ZipCodeValidator();

正在做:

let validators: { [s: string]: StringValidator; } = {};

与:

相同
let validators = {};
validators["s"] = new StringValidator();

如果您可以详细说明语法如何工作的详细信息。

2 个答案:

答案 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,此对象的类型可以包含strings作为对象的键(请记住,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对象。