我在三个地方看到了这一行:
dispatchEvent(event: { type: string; [attachment: string]: any; }): void;
并且想知道它的含义。
我理解这意味着一个名为dispatchEvent的函数,它接受一个带有成员类型的类型的参数,但我不确定是什么:
[attachment: string]: any;
的装置。
答案 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>>();