我可以使用 function.call() 调用通用函数吗?

2024-01-24

通常泛型函数的定义和调用如下:

function identity<T>(arg: T): T {
    return arg;
}
const id1 = identity<string>("hei");

有没有办法调用泛型函数function.bind(), function.call(), or function.apply()?如何指定类型参数?

例如,编译正确,但编译器给我一个错误。

function boundIdentity<T>(this: T): T {
    return this;
}
const id2 = boundIdentity.call<Object>({});

如果我删除类型参数,该函数将按预期工作,但我不会得到类型推断id2.

请参阅 Typescript Playground https://www.typescriptlang.org/play/#src=function%20identity%3CT%3E(arg%3A%20T)%3A%20T%20%7B%0D%0A%20%20%20%20return%20arg%3B%0D%0A%7D%0D%0Aconst%20id1%20%3D%20identity%3Cstring%3E(%22hei%22)%3B%0D%0A%0D%0Afunction%20boundIdentity%3CT%3E(this%3A%20T)%3A%20T%20%7B%0D%0A%20%20%20%20return%20this%3B%0D%0A%7D%0D%0Aconst%20id2%20%3D%20boundIdentity.call%3CObject%3E(%7B%7D)%3B


Yes.

您可以创建一个描述您想要的界面,如下所示:

interface IBoundIdentityFunction {
    <T>(this: T): T;
    call<T>(this: Function, ...argArray: any[]): T;
}

并像这样使用它:

let boundIdentity: IBoundIdentityFunction = function<T>(this: T): T {
    return this;
}

现在,当您执行此操作时,您将获得类型推断:

const id2 = boundIdentity.call<Object>({});

请参阅 TypeScript Playground https://www.typescriptlang.org/play/#src=interface%20IBoundIdentityFunction%20%7B%0D%0A%20%20%20%20%3CT%3E(this%3A%20T)%3A%20T%3B%0D%0A%20%20%20%20call%3CT%3E(this%3A%20Function%2C%20...argArray%3A%20any%5B%5D)%3A%20T%3B%0D%0A%7D%0D%0A%0D%0Alet%20boundIdentity%3A%20IBoundIdentityFunction%20%3D%20function%3CT%3E(this%3A%20T)%3A%20T%20%7B%0D%0A%20%20%20%20return%20this%3B%0D%0A%7D%0D%0A%0D%0Aconst%20id2%20%3D%20boundIdentity.call%3CObject%3E(%7B%7D)%3B

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使用 function.call() 调用通用函数吗? 的相关文章

随机推荐