我用了三个d. t来跨越这条线:
dispatchEvent(event: { type: string; [attachment: string]: any; }): void;
想知道这是什么意思我理解这意味着一个名为dispatchEvent的函数,它接受一个带有成员类型的类型参数,但我不确定是什么:
[attachment: string]: any;
手段。
uurv41yg1#
这是索引签名。TypeScript文档:可索引类型有一个索引签名,它描述了我们可以用来索引到对象中的类型,沿着索引时相应的返回类型。因此,例如,您可以为可索引对象定义一个接口,如下所示:
interface IArrayOfStrings { [index: number]: string; }
这告诉编译器,对于任何类型为IArrayOfStrings的对象,通过数字索引访问的任何成员都将是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,它接受一个{ type: string; [attachment: string]: any; }类型的参数。为了使该类型更容易理解,请查看定义此类型的接口:
dispatchEvent
{ type: string; [attachment: string]: any; }
interface IEvent { type: string; [attachment: string]: any; }
这告诉编译器IEvent类型的对象将具有一个名为type的字符串属性,并且通过字符串索引访问的IEvent对象的元素将是any类型。所以,这样的代码编译时不会出错:
IEvent
type
any
interface IEvent { type: string; [attachment: string]: any; } let myEvent: IEvent = { type: 'some-event-type' }; let eventType: string = myEvent["type"];
44u64gxh2#
方括号声明了一个索引签名,意味着除了type(这是强制性的)之外,您可以将任何内容放入第一个参数中。这基本上削弱了参数的类型安全性。如果函数本身不是消费者,而是使用更强类型的参与者之间的通用链接(他们将对事件结构有更深入的了解),则这种机制非常有用。我添加了另一个答案,因为现有答案将其命名为可选参数,而它不是。一个可选的参数后面加一个“?”“而且很不一样
ttcibm8c3#
您的类型表示以下内容:
type Event = {type: string, [attachment: string]: any };
方括号意味着我们正在谈论一个对象类型。它有一个名为string类型的“type”属性。另一部分称为索引签名。它的作用是将编译时未知的属性Map到类型。因为索引签名的值的类型是any,这意味着这些未知属性可以是任何类型。例如,以下内容将是有效的:
const event: Event = {type: 'abc', bar: {'anything': 123, 'jow': 453}, booo: true};
基本上唯一的限制是我们有一个名为bar的string类型的属性。请注意,名称附件是任意的,可以使用任何其他名称而不改变含义。例如,下面的代码片段在语义上等同于前面的代码片段:
type Event = {type: string, [prop: string]: any };
ut6juiuv4#
现在可以使用ES6新特性**Map**来做事情:
Map
let map: Map<string, EventEmitter<any>> = new Map<string, EventEmitter<any>>();
4条答案
按热度按时间uurv41yg1#
这是索引签名。TypeScript文档:
可索引类型有一个索引签名,它描述了我们可以用来索引到对象中的类型,沿着索引时相应的返回类型。
因此,例如,您可以为可索引对象定义一个接口,如下所示:
这告诉编译器,对于任何类型为
IArrayOfStrings
的对象,通过数字索引访问的任何成员都将是string
类型。所以,这将编译没有错误:
但这不会:
在您的示例中,这一行:
描述了一个方法
dispatchEvent
,它接受一个{ type: string; [attachment: string]: any; }
类型的参数。为了使该类型更容易理解,请查看定义此类型的接口:
这告诉编译器
IEvent
类型的对象将具有一个名为type
的字符串属性,并且通过字符串索引访问的IEvent
对象的元素将是any
类型。所以,这样的代码编译时不会出错:
44u64gxh2#
方括号声明了一个索引签名,意味着除了type(这是强制性的)之外,您可以将任何内容放入第一个参数中。
这基本上削弱了参数的类型安全性。如果函数本身不是消费者,而是使用更强类型的参与者之间的通用链接(他们将对事件结构有更深入的了解),则这种机制非常有用。
我添加了另一个答案,因为现有答案将其命名为可选参数,而它不是。一个可选的参数后面加一个“?”“而且很不一样
ttcibm8c3#
索引签名:
您的类型表示以下内容:
方括号意味着我们正在谈论一个对象类型。它有一个名为
string
类型的“type”属性。另一部分称为索引签名。它的作用是将编译时未知的属性Map到类型。因为索引签名的值的类型是
any
,这意味着这些未知属性可以是任何类型。例如,以下内容将是有效的:基本上唯一的限制是我们有一个名为bar的
string
类型的属性。请注意,名称附件是任意的,可以使用任何其他名称而不改变含义。例如,下面的代码片段在语义上等同于前面的代码片段:
ut6juiuv4#
现在可以使用ES6新特性**
Map
**来做事情: