Что означают квадратные скобки, где поле должно быть в typescript?

Я наткнулся на эту строку в three.d.ts:

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

и задавался вопросом, что это значит.
Я понимаю, что это будет означать функцию dispatchEvent, которая принимает аргумент типа с типом члена, но я не уверен, что:

[attachment: string]: any;

средства.

Ответ 1

Это подпись индекса. Из документации 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; } { type: string; [attachment: string]: any; } { 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"];

Ответ 2

Скобки объявляют подпись индекса, что означает тип, что является обязательным, вы можете поместить что-либо в первый аргумент.

В основном это ослабляет безопасность типа аргумента. Этот механизм очень полезен, если функция сама по себе не является потребителем, а является общей взаимосвязью между игроками, использующими более сильную типизацию (они будут иметь более глубокое знание структуры событий).

Я добавил еще один ответ, потому что существующий ответ назвал это необязательным аргументом, которого нет. Необязательный аргумент с пометкой "?" и совсем другое.

Ответ 3

Теперь использование может сделать что-то с новой функцией ES6 Map:

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