首页 > 解决方案 > 类类型作为 TypeScript 中的参数

问题描述

当参数是特定类型的类时,我有点坚持 TypeScript 中的类型提示。我正在尝试实现一个事件系统,当我使用来自 TypeScript 游乐场的代码时,一切都适用于纯 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);

标签: typescripttypestype-hinting

解决方案


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
}

多田!


推荐阅读