我尝试创建一个非常简单的函数,它可以接受:
的可选参数数组
普通JS中的函数如下所示:
const callCallback = (cb, args = []) => cb(...args);回调可能接受任意数量的参数&返回任何参数。问题是我不能正确地用TypeScript来表达回调的类型。我试图像这样声明callCallback的类型(其想法是推断回调的参数和返回类型):
export interface CallCallback {
<CbReturn, CbArgs>(
cb: (...optionalArguments: CbArgs[]),
args?: CbArgs[],
): CbReturn
};但是,这没有起作用,因为它迫使回调使用扩展语法的参数,而这不是我想要做的。
我也找到了this answer,但就目前而言,TS不允许我将扩展参数设置为可选的。
如何将args数和类型推断为cb参数列表?
发布于 2021-01-29 20:31:22
下面这些有用吗?从本质上说,你是在输入apply
interface ApplyFn {
<F extends () => any>(fn: F): ReturnType<F>;
<F extends (...args: any[]) => any>(fn: F, args: Parameters<F>): ReturnType<F>;
}
declare const apply: ApplyFn;
apply((f: number, s: string, t: Date) => f + s + t, [23, "two", new Date]); // OK
apply((f: number, s: string, t: Date) => f + s + t, ["not a number", "two", new Date]); // ERR
apply((f: number, s: string, t: Date) => f + s + t, [123, "two"]); // ERR
apply(() => "nice!", []); // OK
apply(() => "nice!"); // OK
apply((param: number) => "nice!"); // ERR编辑:上面的类型是有用的,如果你有一个洞为这种类型的函数适应(例如,一个函数参数)。如果您实际上试图定义此函数,则将其表示为标准函数定义更容易:
function apply<F extends () => any>(fn: F): ReturnType<F>;
function apply<F extends (...args: any[]) => any>(fn: F, args: Parameters<F>): ReturnType<F>;
function apply(fn: Function, args: any[] = []) {
return fn(args);
}https://stackoverflow.com/questions/65960845
复制相似问题