Что означает эта строка TypeScript?

Я только что нашел строку в файле TypeScript внутри класса, которая выглядит как

private handlers: ((event: string) => void)[]

Тогда есть еще одна функция:

  private fire(event: string): void {
    for (const handler of this.handlers) {
      handler(event);
    }
  }

Поэтому я предполагаю, что у каждого элемента массива есть функция, которую можно вызвать, но я действительно не понимаю, как это работает. Если к каждому элементу прикреплена эта функция, которая всегда возвращает void, не должны ли все элементы массива быть полностью пустыми?

Или это какой-то волшебный синтаксис TypeScript?

Он определяет массив функций.

jonrsharpe 22.04.2022 22:18

"я предполагаю, что у каждого элемента массива есть функция, которую можно вызвать, но я действительно не понимаю, как это работает" Это не волшебство. Это просто базовый TS: (event: string) => void — это обозначение типа для функции. X[] — это обозначение типа для массива Xes.

VLAZ 22.04.2022 22:19
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
0
2
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Скобки [] в машинописи объявляют массив. И синтаксис (...params: any[]) => any объявляет функцию. Итак, объединив вместе (и используя скобки!) вы получите массив функций.

Это означает, что свойство handlers представляет собой массив функций, которые принимают один параметр event типа string и возвращают void. Таким образом, элементы внутри массива не все являются "имеют" функцией, которую можно вызвать, но они являются функциями находятся.

Здесь важно отметить, что массив содержит только функции. Они не вызываются. Чтобы на самом деле запустить функции, вам нужно будет получить их (путем итерации или индексации массива) и вызвать их с указанными параметрами, как и любую другую функцию.

Хорошо, спасибо, я понял эту часть, но разве элемент не должен быть пустым с возвращаемым типом void? Я думаю, что массив, который доступен для записи, но не для чтения, не имеет смысла, что мне не хватает?

Sagích dirnet 22.04.2022 22:25

Что вы подразумеваете под элементами, которые должны быть пустыми, и почему массив не читается... он читается в функции fire

MrCodingB 22.04.2022 22:25

Для меня эта первая строка выглядит как Array.fill( () => undefined)

Sagích dirnet 22.04.2022 22:32

Нет... это как Array.map(() => () => { })), потому что массив заполняется не undefined, а функциями

MrCodingB 22.04.2022 22:34

sry.. Я действительно пытаюсь это понять, но определение этих функций в массиве уже говорит, что возвращаемый тип недействителен? Например, если я вызываю функцию огня в примере в публикации. Я вызываю каждую функцию в массиве со строковым параметром и... черт, я только что нашел функцию, которая добавлена, и теперь все это имеет смысл. Спасибо друг

Sagích dirnet 22.04.2022 22:41

Может быть, это легче понять, если вы читаете это так:

private handlers: Function[]

да, так я могу это понять. Я просто очень запутался в возвращаемом типе void

Sagích dirnet 22.04.2022 22:26

Void указывает только, что функции внутри массива ничего не возвращают при вызове... это точно так же, как и любая другая функция в TS/JS.

MrCodingB 22.04.2022 22:29

@MrCodingB Многие функции не возвращают void в JS/TS. Простые примеры: parseInt, Boolean, () => 4 и много-много, еще многие.

VLAZ 22.04.2022 22:34

Да, извините... "каждая" другая функция была немного неправильной... Я просто имел в виду, что в этом нет ничего особенного или необычного.

MrCodingB 22.04.2022 22:36

Другие вопросы по теме

Похожие вопросы

Передача vscode во внешние функции
Firebase: Почему мой код использует только первый документ в моей коллекции?
Реагировать на ошибку машинописного текста - элемент неявно имеет любой тип, потому что выражение строки типа не может использоваться для индексирования типа {}
Как получить доступ к вложенным необязательным индексам из интерфейса
Почему машинописный текст не может контекстуально вывести эти типы промежуточного программного обеспечения
Передать конструктор класса как функцию в другом классе
React & clsx: добавьте имя класса, если текущий элемент в сопоставленном массиве является первым из нескольких элементов
Свойство «MathFun» отсутствует в типе «(x?: число, y?: число) => число», но требуется в типе «Func».
Получение строки типа не может быть назначено строке типа для компонента TS в сборнике рассказов
Как ввести useState для файлов?