【问题标题】:Class type as parameter in TypeScript类类型作为 TypeScript 中的参数
【发布时间】:2019-12-22 19:54:03
【问题描述】:

当参数是特定类型的类时,我对 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);

【问题讨论】:

  • 链接不包含代码。您能否也发布一个带有用法示例的完整示例。
  • 我认为(c1: typeof C1, c2: C2, callback: (arg1: C1, arg2: C2) =&gt; void)C1 之前不需要typeof

标签: typescript types type-hinting


【解决方案1】:

TypeScript 中的类的行为与您想象的不同。直接从 TS 解释器检查这个 sn-p:

~ 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
}

多田!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多