Ответ 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"];