目前我有类型定义为:
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>;
}
其他回答
我刚开始使用Typescript,我一直试图解决类似的问题,就像这样;如何告诉Typescript我正在传递一个没有接口的回调。
在浏览了Stack Overflow和GitHub问题的一些答案后,我终于找到了一个解决方案,可以帮助任何有同样问题的人。
函数的类型可以用(arg0: type0) => returnType定义,并且可以在另一个函数的形参列表中使用此类型定义。
function runCallback(callback: (sum: number) => void, a: number, b: number): void {
callback(a + b);
}
// Another way of writing the function would be:
// let logSum: (sum: number) => void = function(sum: number): void {
// console.log(sum);
// };
function logSum(sum: number): void {
console.log(`The sum is ${sum}.`);
}
runCallback(logSum, 2, 2);
你可以用多种方式在接口中定义函数类型,
一般方法:
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;
}
根据Ryan的回答,我认为你所寻找的接口定义如下:
interface Param {
title: string;
callback: () => void;
}
全局类型Function用于此目的。
此外,如果你打算用0个参数调用这个回调函数并忽略它的返回值,type () => void匹配所有不带参数的函数。
定义函数类型有多种方法;然而,有些比其他的好。
虽然可以使用JavaScript函数对象Function,但不要这样做。 ESLint插件推荐规则ban-types
避免使用Function类型,因为它提供的安全性很少,原因如下: 它在调用值时不提供类型安全,这意味着很容易提供错误的参数。 它接受类声明,类声明在调用时会失败,因为调用时没有new关键字。
TypeScript支持多种其他方式。最常见的是使用函数类型表达式。这个方法非常类似于箭头函数。
如果已知参数和返回值是某种形式,则应该键入它们。 例如,
interface Param {
callback: (foo: string, bar: number) => void
}
请注意,这些类型可以根据需要非常复杂,例如使用对象类型或从其他类型创建的类型。
如果类型确实是未知的,则选择unknown而不是any。 ESLint插件推荐规则no-explicit-any
当使用any时,所有围绕该值的编译器类型检查都将被忽略。
从TS文档中,
Unknown是any的类型安全对应项。
因此,使用扩展语法,
interface Params {
callback: (...args: unknown[]) => unknown
}