当前位置: 首页 > 知识库问答 >
问题:

TypeScript:如何为方法参数中使用的函数回调(作为任意函数类型,而不是通用的任意)定义类型

东方富
2023-03-14

当前我的类型定义为:

interface Param {
    title: string;
    callback: any;
}

我需要这样的东西:

interface Param {
    title: string;
    callback: function;
}

但第二个不被接受。

共有2个答案

丌官和泰
2023-03-14

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处理程序之类的东西很有用。

可以用这种方式对函数进行强烈的类型化,尽管如果试图用类型别名来确定所有内容,您可能会得意忘形,并遇到组合问题。

陈寒
2023-03-14

全局类型function可用于此目的。

此外,如果您打算用0个参数调用此回调并忽略它的返回值,则()=>void类型匹配所有不带参数的函数。

这里的答案和问题有太多的改进,更不用说唯一稍微复杂一些但却是最佳实践的方法:

问题的解决方案

interface Easy_Fix_Solution {
    title: string;
    callback: Function;
}

注意:请不要使用function,因为您很可能不需要任何回调函数。具体一点是可以的。

对该解决方案改进

interface Safer_Easy_Fix {
    title: string;
    callback: () => void;
}
interface Alternate_Syntax_4_Safer_Easy_Fix {
    title: string;
    callback(): void;
}

注:原作者是正确的,不接受论点,返回void更好…它更安全,它告诉接口的使用者,您不会对它们的返回值执行任何操作,也不会向它们传递任何参数。

更好的是使用泛型。这个接口也可以用于前面提到的()=>void函数类型。

interface Better_still_safe_but_way_more_flexible_fix {
    title: string;
    callback: <T = unknown, R = unknown>(args?: T) => R;
}
interface Alternate_Syntax_4_Better_still_safe_but_way_more_flexible_fix {
    title: string;
    callback<T = unknown, R = unknown>(args?: T): R;
}

注意:如果您现在不能100%确定回调签名,请选择上面的void选项,如果您认为可以继续扩展功能,请选择这个通用选项。回调通常会接收某种类型的参数,有时回调orchestrator甚至会对返回值执行某些操作。

还有一个稍微高级一点的用法,除非你需要它,否则你不应该使用它

这允许T中任何类型的任意数量的参数。

这里有更多细节。

interface Alternate_Syntax_4_Advanced {
    title: string;
    callback<T extends unknown[], R = unknown>(...args?: T): R;
}
 类似资料: