Может кто-нибудь объяснить мне этот тип (() => void)[] = []

#typescript #typescript-typings

#typescript #typescript-типизации

Вопрос:

Я наткнулся на этот тип (() => void)[] = [] , может кто-нибудь мне это объяснить

 public functionName: (() => void)[] = []
 

это функция, которая не возвращает, но я не понимаю остальной синтаксис массива.

Ответ №1:

Это переменная типа: массив функций без параметров, которые не возвращают значения. Инициализируется пустым массивом.

Комментарии:

1. [] = [] это означает, что инициализируется пустым массивом.

2. Да, это то же самое, что: пусть arr: (() => void)[]; arr = [];

3. Просто в качестве предложения избегайте использования [] для массивов, если тип элемента является сложным типом (т.Е. Не Просто именем типа). Array<() => void> гораздо более читаемый IMO.

Ответ №2:

Это массив функций

 public functionName: 
   (() => void)[]  // array of functions that take no parameter and return nothing
   = [] // initialization of functionName with an empty array
 

Ответ №3:

 public numbers: number[] = []
 

Это переменная, называемая числами, и это массив чисел.
Теперь важная часть — понять

 ()=>void
(x) => return x
 

Это простое лямбда-выражение (вы можете подробнее узнать об этом в Google). Но суть его в том, что левая часть — это переданные параметры, а правая часть — это реализация.
Итак, ваше выражение представляет собой массив, содержащий лямбда-выражения. Я просто уточняю ответ Томаша Из, чтобы вы могли лучше его понять.

Комментарии:

1. Это не обязательно должны быть лямбда-выражения; это любая функция, которая может быть вызвана с нулевыми аргументами.

Ответ №4:

Может быть, немного поздно, и ответ уже дан, но я все же хочу дать более глубокий.

Тип X[] означает массив X .

Тип ()=>void означает функцию, которая ничего не возвращает.

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

Таким образом, тип (X) является тем же типом, X что и .

So (()=>void)[] означает массив функций, которые ничего не возвращают.

Примечание: Ничего, это не то же самое, что never . По крайней мере, не в этом случае. TS — такая классная система типов по сравнению с таким беспорядком языка (JS)… Он так старается быть крутым и потрясающим, и при том же типе его перетаскивает JS.

Функции в JS могут останавливаться / завершаться / завершаться без возврата значения. Это в функциональных языках, где каждая функция возвращает что-то, означает возврат Unit … как и в типе, который имеет только одно представление во время выполнения: кортеж нулевой арности. Сколько существует кортежей нулевой арности? … 1. Значение, которое означает, что процедура завершилась, НО также и значение, которое не содержит соответствующей информации (его можно игнорировать).

С другой стороны, есть случай, когда функции фактически ничего не возвращают. Это означает, что функции либо терпят неудачу, либо фактически никогда не завершаются (т.е. ()=>{while(true){}} ).

Тот «тип», который его представляет, известен как never в TS, Void в Haskell, Nothing в Scala и Kotlin, и да, это так

Unit Тип, о котором я говорил ранее, на самом деле не имеет представляющего типа в TS … (хотя его можно легко представить с помощью типа null , undefined , и в некоторых случаях void ). В Kotlin и Scala он известен как Unit , а в Haskell упоминается как Unit, но записывается () (кортеж нулевой арности). В Java это каким-то образом представлено void методами, но если вы спросите меня, я думаю, что это просто плохой дизайн. Это не совсем методы, которые возвращают единицу, а методы, которые не возвращают (как в TS и JS).

Я думаю, это просто плохой дизайн.