В настоящее время у меня есть определение типа как:
interface Param {
title: string;
callback: any;
}
Мне нужно что-то вроде:
interface Param {
title: string;
callback: function;
}
но второй не принимается.
В настоящее время у меня есть определение типа как:
interface Param {
title: string;
callback: any;
}
Мне нужно что-то вроде:
interface Param {
title: string;
callback: function;
}
но второй не принимается.
Для этого служит глобальный тип Function
.
Кроме того, если вы намереваетесь вызывать этот обратный вызов с помощью 0 аргументов и игнорируете его возвращаемое значение, тип () => void
соответствует всем функциям без аргументов.
Typescript из v1.4 имеет ключевое слово type
, которое объявляет псевдоним типа (аналогичный typedef
в C/С++). Вы можете объявить свой тип обратного вызова таким образом:
type CallbackFunction = () => void;
который объявляет функцию, которая не принимает аргументов и ничего не возвращает. Функция, которая принимает ноль или более аргументов любого типа и ничего не возвращает, будет:
type CallbackFunctionVariadic = (...args: any[]) => void;
Тогда вы можете сказать, например,
let callback: CallbackFunctionVariadic = function(...args: any[]) {
// do some stuff
};
Если вам нужна функция, которая принимает произвольное количество аргументов и возвращает что-либо (включая void):
type CallbackFunctionVariadicAnyReturn = (...args: any[]) => any;
Вы можете указать некоторые обязательные аргументы, а затем набор дополнительных аргументов (например, строку, число и затем набор дополнительных аргументов):
type CallbackFunctionSomeVariadic =
(arg1: string, arg2: number, ...args: any[]) => void;
Это может быть полезно для таких вещей, как обработчики EventEmitter.
Функции могут быть набраны так сильно, как вам нравится, таким образом, хотя вы можете увлечься и столкнуться с комбинаторными проблемами, если попытаетесь прибить все с помощью псевдонима типа.
Следуя ответам Райана, я думаю, что интерфейс, который вы ищете, определяется следующим образом:
interface Param {
title: string;
callback: () => void;
}
Вот пример функции, которая принимает обратный вызов
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
Он действителен TypeScript, но будет интерпретироваться как...
// watch out! typescript will think it means ...
const sqk = (x: number, callback: ((number: any) => number)): number
Т.е., TypeScript будет считать, что имя параметра number
, а подразумеваемый тип - any
. Это явно не то, что мы намеревались, но, увы, так работает TypeScript.
Поэтому не забудьте указать имена параметров при наборе параметров функции... как бы это ни было глупо.
Вы можете определить тип функции в интерфейсе различными способами,
export interface IParam {
title: string;
callback(arg1: number, arg2: number): number;
}
export interface IParam {
title: string;
callback: (arg1: number, arg2: number) => number;
}
type MyFnType = (arg1: number, arg2: number) => number;
export interface IParam {
title: string;
callback: MyFnType;
}
Использование очень просто,
function callingFn(paramInfo: IParam):number {
let needToCall = true;
let result = 0;
if(needToCall){
result = paramInfo.callback(1,2);
}
return result;
}
export interface IParam{
title: string;
callback(lateCallFn?:
(arg1:number,arg2:number)=>number):number;
}
interface Param {
title: string;
callback: () => void;
}