目前我有类型定义为:
interface Param {
title: string;
callback: any;
}
我需要这样的东西:
interface Param {
title: string;
callback: function;
}
但是第二项不被接受。
目前我有类型定义为:
interface Param {
title: string;
callback: any;
}
我需要这样的东西:
interface Param {
title: string;
callback: function;
}
但是第二项不被接受。
当前回答
如果您正在寻找类似于change事件的输入回调函数,则使用以下方法
type Props = {
callBack: ChangeEventHandler<HTMLInputElement>;
}
其他回答
全局类型Function用于此目的。
此外,如果你打算用0个参数调用这个回调函数并忽略它的返回值,type () => void匹配所有不带参数的函数。
根据Ryan的回答,我认为你所寻找的接口定义如下:
interface Param {
title: string;
callback: () => void;
}
从v1.4开始的Typescript有type关键字,它声明了一个类型别名(类似于C/ c++中的typedef)。你可以这样声明你的回调类型:
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处理器之类的东西很有用。
在这种方式下,函数的类型可以随心所欲,尽管如果您试图用类型别名确定所有内容,可能会失去控制并遇到组合问题。
下面是一个接受回调函数的例子
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
});
注意,我用于回调参数的签名…
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的工作方式。
因此,在输入函数参数时,不要忘记提供参数名……尽管这看起来很愚蠢。
如果您正在寻找类似于change事件的输入回调函数,则使用以下方法
type Props = {
callBack: ChangeEventHandler<HTMLInputElement>;
}