Typescript:如何为方法参数中使用的函数callback(如任何函数types,不是通用的)定义types
目前我有types定义为:
interface Param { title: string; callback: any; }
我需要像这样的东西:
interface Param { title: string; callback: function; }
但是第二个不被接受。
全局typesFunction
用于此目的。
此外,如果打算使用0参数调用此callback函数,并忽略其返回值,则type () => void
匹配不带任何参数的所有函数。
1.4版的Typescript具有type
关键字,它声明了一个types别名(类似于C / C ++中的typedef
)。 你可以这样声明你的callbacktypes:
type CallbackFunction = () => void;
它声明了一个不带参数的函数,并且不返回任何内容。 一个函数接受任何types的零个或多个参数,不返回任何内容:
type CallbackFunctionVariadic = (...args: any[]) => void;
那么你可以说,例如,
let callback: CallbackFunctionVariadic = function(...args: any[]) { // do some stuff };
如果你想要一个接受任意数量参数并返回任何东西(包括void)的函数:
type CallbackFunctionVariadicAnyReturn = (...args: any[]) => any;
你可以指定一些强制参数,然后是一组额外的参数(比如说一个string,一个数字,然后是一组额外的参数):
type CallbackFunctionSomeVariadic = (arg1: string, arg2: number, ...args: any[]) => void;
这对于EventEmitter处理程序这样的东西可能很有用。
函数可以按照这种方式尽可能强地input,但是如果你试图用types别名来指定所有的东西,你可能会被拿走并且碰到组合问题。
根据Ryan的回答,我认为你正在寻找的接口定义如下:
interface Param { title: string; callback: () => void; }
这里是一个接受callback函数的例子
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 });
如果你不关心callback的返回值(大多数人不知道如何以有效的方式使用它们),你可以使用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缺陷,因为我们期望为callback参数提供一个名称 。 在这种情况下,我使用了_
因为它在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
,隐含types是any
。 这显然不是我们想要的,但唉,这就是TypeScript的工作原理。
所以不要忘记提供参数名称时,键入你的函数参数…愚蠢的,因为它可能看起来。