方括号是什么意思字段应该在 typescript 中的位置?

6pp0gazn  于 2023-06-07  发布在  TypeScript
关注(0)|答案(4)|浏览(234)

我用了三个d. t来跨越这条线:

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

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

[attachment: string]: any;

手段。

uurv41yg

uurv41yg1#

这是索引签名。TypeScript文档:
可索引类型有一个索引签名,它描述了我们可以用来索引到对象中的类型,沿着索引时相应的返回类型。
因此,例如,您可以为可索引对象定义一个接口,如下所示:

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对象的元素将是any类型。
所以,这样的代码编译时不会出错:

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

let myEvent: IEvent = {
    type: 'some-event-type'
};

let eventType: string = myEvent["type"];
44u64gxh

44u64gxh2#

方括号声明了一个索引签名,意味着除了type(这是强制性的)之外,您可以将任何内容放入第一个参数中。
这基本上削弱了参数的类型安全性。如果函数本身不是消费者,而是使用更强类型的参与者之间的通用链接(他们将对事件结构有更深入的了解),则这种机制非常有用。
我添加了另一个答案,因为现有答案将其命名为可选参数,而它不是。一个可选的参数后面加一个“?”“而且很不一样

ttcibm8c

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 };
ut6juiuv

ut6juiuv4#

现在可以使用ES6新特性**Map**来做事情:

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

相关问题