gpt4 book ai didi

javascript - Typescript .bind() 在使用超过 4 个参数时给出类型错误

转载 作者:行者123 更新时间:2023-11-29 22:53:17 28 4
gpt4 key购买 nike

使用 typescript 3.5.2 我遇到了与 .bind() 相关的问题。

我正在尝试使用一些初始参数绑定(bind)一个函数。

async foo(arg1: any,
arg2: any,
arg3: any,
arg4: any,
arg5: any,
arg6: any,
arg7: any) {
//some fancy tasks
}

我正在尝试将函数与上下文和一些初始参数绑定(bind)。

private buildHandler(arg1: Function, arg2: IReplaceSet[], arg3: IReplaceSet[] = [], arg4: IReplaceAsset[] = [], arg5: boolean) {
return this.foo.bind(this, arg1, arg2, arg3, arg4, arg5);
}

Typescript 将 .bind 解析为这种类型。

bind<T, AX, R>(this: (this: T, ...args: AX[]) => R, thisArg: T, ...args: AX[]): (...args: AX[]) => R;

错误编译器给出:

return this.foo.bind(this, arg1, (error)arg2, arg3, arg4, arg5);

Error:(401, 64) TS2345: Argument of type 'any' is not assignable to parameter of type 'Function'. Type 'IReplaceSet[]' is missing the following properties from type 'Function': apply, call, bind, prototype, and 4 more.


编辑1:每当我从绑定(bind)错误修复中删除任何这些初始参数时

return this.foo.bind(this, arg1, arg2, arg3, ag4);

为什么 typescript .bind() 定义有参数限制?因为它符合类型

bind<T, A0, A1, A2, A3, A extends any[], R>(this: (this: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3): (...args: A) => R;

编辑2:传播也解决了这个问题,但为什么呢?

return this.foo.bind(this, ...[arg1, arg2, arg3, arg4, arg5]);

编辑3:现在我认为这是一个与 typescript 相关的问题,我解决了这个问题。我会提交一个答案,因为这是一个重要的问题。

最佳答案

带有 bind 方法的 Typescript CallableFunction 接口(interface)最多支持 4 个具有唯一类型定义的参数。

interface CallableFunction extends Function {
bind < T > (this: T, thisArg: ThisParameterType < T > ): OmitThisParameter < T > ;
bind < T, A0, A extends any[], R > (this: (this: T, arg0: A0, ...args: A) => R, thisArg: T, arg0: A0): (...args: A) => R;
bind < T, A0, A1, A extends any[], R > (this: (this: T, arg0: A0, arg1: A1, ...args: A) => R, th
isArg: T, arg0: A0, arg1: A1): (...args: A) => R;
bind < T, A0, A1, A2, A extends any[], R > (this: (this: T, arg0: A0, arg1: A1, arg2: A2, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1, arg2: A2): (...args: A) => R;
bind < T, A0, A1, A2, A3, A extends any[], R > (this: (this: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3): (...args: A) => R;
bind < T, AX, R > (this: (this: T, ...args: AX[]) => R, thisArg: T, ...args: AX[]): (...args: AX[]) => R;
}

如您所见,类型支持 bind(context, arg1, arg2, arg3, arg4):

bind < T, A0, A1, A2, A3, A extends any[], R > (this: (this: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3): (...args: A) => R;

但是只要你使用超过 4 个初始参数,它就会使用这种类型:

bind < T, AX, R > (this: (this: T, ...args: AX[]) => R, thisArg: T, ...args: AX[]): (...args: AX[]) => R;

并且此类型要求所有初始参数都是通用类型 AX,这意味着:您将使用的所有参数都应与您的第一个参数具有相同的类型。举个例子:

这会报错。因为 arg4 的类型和 arg1 不一样

arg1: string;
arg2: string;
arg3: string;
arg4: number;
arg5: string;
arg6: string;
bind(context, arg1, arg2, arg3, arg4, arg5, arg6);

Spreading 解决了我的问题,因为 spreading 在 typescript 上还没有任何类型定义。

我希望它对其他人也有帮助。

关于javascript - Typescript .bind() 在使用超过 4 个参数时给出类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57072381/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com