gpt4 book ai didi

javascript - 在 typescript 中使用变量作为方法

转载 作者:行者123 更新时间:2023-12-05 04:50:54 24 4
gpt4 key购买 nike

我想在 typescript 中通过变量名动态调用方法,如下例所示。

function callMethod(_class, method: string){
let classObj = new _class();
return classObj[method]()
}

前面的代码片段没有任何实际好处,但它可以用最少的代码明显地说明思路。

但是,如果您在 tsconfig.json 中启用了选项 noImplicitAny,则必须添加类型注释

return classObj[method as keyof typeof classObj]()

理论上,它在Js中工作正常,但ts提示并非所有成分都是可调用的,并显示此错误:

This expression is not callable.
Not all constituents of type ... are callable.

我如何在 typescript 中动态调用方法?

最佳答案

如果你使方法、类和类的静态部分都是通用的,你可以这样做:

function callMethod<
M extends PropertyKey,
C extends {[K in M]: () => any},
T extends {new(): C}
>(_class: T, method: M): ReturnType<InstanceType<T>[M]> {
const classObj = new _class();

return classObj[method]()
}

class Test {
someMethod(): number { return 8}
}

const t1 = callMethod(Test, 'someMethod') // Inferred type: number.

const t2: string = callMethod(Test, 'someMethod')
// ERROR: .. Type 'number' is not assignable to type 'string'.

const t3 = callMethod(Test, 'noMethod')
// ERROR: .. Property 'noMethod' is missing in type 'Test' but required in
// type '{ noMethod: () => unknown; }'.

TypeScript playground

内部callMethod method 的返回类型将是 any , 但将其键入第四个类型参数并使其与 ReturnType<InstanceType<T>[M]> 一致似乎很棘手(并且可能不可能)。不过,只要您直接返回方法调用的结果,这应该不是什么大问题。

关于javascript - 在 typescript 中使用变量作为方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67169065/

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