方括号表示字段在打字稿中的位置是什么意思?

时间:2016-07-15 20:13:16

标签: typescript

我在三个地方看到了这一行:

dispatchEvent(event: { type: string; [attachment: string]: any; }): void;

并且想知道它的含义。
我理解这意味着一个名为dispatchEvent的函数,它接受一个带有成员类型的类型的参数,但我不确定是什么:

[attachment: string]: any;

的装置。

3 个答案:

答案 0 :(得分:23)

这是一个索引签名。来自TypeScript documentation

  
    

可索引类型有一个索引签名,它描述了我们可以用来索引对象的类型,以及索引时相应的返回类型。

  

因此,例如,您可以为可索引对象定义接口,如:

interface IArrayOfStrings {
    [index: number]: string;
}

这告诉编译器,对于类型IArrayOfStrings的任何对象,由数字索引访问的任何成员都将是string类型。

所以,这将编译而不会出错:

interface IArrayOfStrings {
    [index: number]: string;
}

let words: IArrayOfStrings = ["foo","bar"];

let word: string = words[0];

但这不会:

interface IArrayOfStrings {
    [index: number]: string;
}

let words: IArrayOfStrings = ["foo","bar"];

let myNumber: number = words[0];

在你的例子中,这一行:

dispatchEvent(event: { type: string; [attachment: string]: any; }): void;

描述了一个方法dispatchEvent,它接受​​一个{ type: string; [attachment: string]: any; }类型的参数。

要使该类型更易于理解,请查看定义此类型的接口:

interface IEvent {
    type: string;
    [attachment: string]: any;
}

这告诉编译器类型为IEvent的对象将具有名为type的字符串属性,并且由字符串索引访问的IEvent对象的元素将为{{1输入。

所以,像这样的东西会编译而没有错误:

any

答案 1 :(得分:1)

括号声明一个索引签名,意思是类型旁边,这是强制性的,你可以把任何东西放到第一个参数中。

基本上这削弱了论证的类型安全性。如果函数本身不是消费者,而是使用更强类型的玩家之间的通用链接(他们将对事件结构有更深入的了解),这种机制非常有用。

我添加了另一个答案,因为现有的答案将此命名为可选参数,而不是。可选参数后缀为“?”和完全不同。

答案 2 :(得分:-2)

现在可以使用ES6新功能 Map

let map: Map<string, EventEmitter<any>> = new Map<string, EventEmitter<any>>();