Вот пример функции, которая принимает функцию обратного вызова
const sqk = (x: number, callback: ((_: number) => number)): number => {
// callback will receive a number and expected to return a number
return callback (x * x);
}
// here our callback will receive a number
sqk(5, function(x) {
console.log(x); // 25
return x; // we must return a number here
});
Если вы не заботитесь о возвращаемых значениях обратных вызовов (большинство людей не знают, как использовать их в любом эффективном способе), вы можете использовать void
const sqk = (x: number, callback: ((_: number) => void)): void => {
// callback will receive a number, we don't care what it returns
callback (x * x);
}
// here our callback will receive a number
sqk(5, function(x) {
console.log(x); // 25
// void
});
Примечание, подпись я использовал для параметра callback
...
const sqk = (x: number, callback: ((_: number) => number)): number
Я бы сказал, что это дефицит TypeScript, потому что мы ожидаем предоставить имя для параметров обратного вызова.В этом случае я использовал _
, потому что он не используется внутри функции sqk
.
Однако, если вы сделаете это
// danger!! don't do this
const sqk = (x: number, callback: ((number) => number)): number
Это действует машинопись, но это будет истолковано как ...
// watch out! typescript will think it means ...
const sqk = (x: number, callback: ((number: any) => number)): number
Т.е., машинопись подумают параметр имя является number
и подразумеваемый тип - any
. Это явно не то, что мы намеревались, но, увы, так работает TypeScript.
Так что не забудьте указать имена параметров при наборе параметров своей функции ... глупо, как может показаться.
Эта вещь отсутствует в [основных типах] (https://www.typescriptlang.org/docs/handbook/basic-types.html) – Yogesh
Это не базовый тип, потому что вы должны определить свои аргументы и вернуть значения. что-то вроде callback: (number: number) => void; гораздо полезнее для проверки типов, чем callback: function; было бы. – kpup