TypeScript: Функції як параметри
TypeScript: Функції як параметри
У TypeScript використовується кілька способів типизувати функції, які передаються як параметри.
Найпростіший – використовувати тип Function
. Він описує функцію JavaScript з усіма її особливостями, включаючи властивості bind, call та apply.
Опишемо вхідний параметр callback функції process:
function process(callback: Function) { const value = callback(); // ... }
Function
відключає перевірку типів для функції, що викликається. В результаті кількість і тип вхідних аргументів не перевіряються, а результатом роботи такої функції буде any
. Це може призвести до логічних помилок та несподіваної поведінки:
process(Math.round); //?
Даний приклад спрацює, хоча поведінка навряд чи буде очікуваною, оскільки Math.round
викличеться без аргументів і поверне NaN
. Тому ми рекомендуємо уникати використання Function
.
Інший спосіб описувати функції - використовувати стрілочну функцію із зазначенням вхідних та вихідних типів:
function process(callback: () => string) { // value має тип string const value = callback(); // ... }process(Math.round); // Argument of type '(x: number) => number' is not // assignable to parameter of type '() => string'.
Визначення стрілочної функції схоже на справжню, але тут важливо не переплутати. Тут бачимо саме опис типу, а не визначення функції.
Розглянемо ще кілька прикладів для закріплення:
function process(callback: () => number) function process(callback: () => string[]) function process(callback: () => { firstName: string; })
Параметри синтаксично вказуються так само, як і для стрілочних функцій:
function process(callback: (n: number) => string) { const value = callback(10); // ... }
Тут ми визначили тип callback
функцією з параметром n з типом number і значення string, що повертається.
Якщо визначення функції зустрічається часто, то для нього можна створити псевдонім:
type myFunction = (n: number) => string; function process(callback: myFunction) { const value = callback(10);< // ... }
Такий запис спрощує читання коду та дозволяє уникнути дублювання.
Category: JavaScript | Comments: 0