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的工作原理。

所以不要忘记提供参数名称时,键入你的函数参数…愚蠢的,因为它可能看起来。