gpt4 book ai didi

typescript - 类类型作为 TypeScript 中的参数

转载 作者:行者123 更新时间:2023-12-05 03:58:59 25 4
gpt4 key购买 nike

当参数是特定类型的类时,我有点难以接受 TypeScript 中的类型提示。我正在尝试实现一个事件系统,当我使用 TypeScript playground 中的代码时,纯 JavaScript 一切正常。但是,标准编译会导致错误“TS2693:‘C1’仅指类型,但在此处用作值。”我如何输入提示此方法?

function method
<C1 extends BaseClass, C2 extends BaseClass>
(c1: typeof C1, c2: typeof C2, callback: (arg1: C1, arg2: C2) => void){
// ...
}

完整示例:

abstract class BaseClass {}

const dict = {}

function method
<C1 extends BaseClass, C2 extends BaseClass>
(c1: typeof C1, c2: typeof C2, callback: (arg1: C1, arg2: C2) => void){
dict[c1] = dict[c1] || {};
dict[c1][c2] = dict[c1][c2] || [];
dict[c1][c2].push(callback);
}


class MyClass1 extends BaseClass{}
class MyClass2 extends BaseClass{}


method(MyClass1, MyClass2, (arg1: MyClass1, arg2: MyClass2) => {
console.log("Callback");
});

const c1 = new MyClass1();
const c2 = new MyClass2();
dict[MyClass1][MyClass2][0](c1, c2);

最佳答案

TypeScript 中的类并不像您想象的那样。直接从 TS 解释器中检查这个片段:

~ ts-node
> class a {}
undefined
> typeof a
'function'

它表明 a 只是一个函数,因此参数类型提示将计算为文字字符串 'function'!

> function b(param: a) { console.log(param) };
> b(a)
[Function: a]
> b(new a())
a {}

以上代码是如何正确使用类类型作为参数的示例。不需要 typeof。在您的代码中,它可能看起来像这样:

function method
<C1 extends BaseClass, C2 extends BaseClass>
(c1: C1, c2: C2, callback: (arg1: C1, arg2: C2) => void){
// ...
}

如果您的意思是您想要实际传递类类型 本身,那么您需要解决 TS 的反射限制。您可以将类型作为返回类型的函数传递:

function method
<C1 extends BaseClass, C2 extends BaseClass>
(c1: new () => C1, c2: new () => C2, callback: (arg1: C1, arg2: C2) => void){
new c1() instanceof C1; // true
new c2() instanceof C2 // true
c1 instanceof C1 // false
}

多田!

关于typescript - 类类型作为 TypeScript 中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57525497/

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