【问题标题】:Typescript generics type comparison not working打字稿泛型类型比较不起作用
【发布时间】:2020-07-03 10:14:52
【问题描述】:

我在将元素“子”与泛型类型 T 进行比较并返回仅包含这些类型的子元素的数组时遇到了麻烦。

逻辑很简单,我有一个具有不同元素的子数组,它们都继承自“Test”类型。我只想要一部分“特殊”孩子。

我现在似乎能够找到一个解决方案,以任何方式将泛型类型 T 与子类型进行比较。

产生的错误是

TS2693:'T' 仅指一种类型,但在此处用作值

我用instanceoftypeofObject.getPrototypeOf 尝试过,没有任何效果。

 public getChildrenByType<T extends Test>(): T[] {
        const output:T[] = [];
        for(const child of this.children) {
            if(child instanceof T) {
                output.push(child);
            }
        }
    }
    return output;
}

【问题讨论】:

    标签: typescript typescript-generics typescript3.8


    【解决方案1】:

    问题在于,在将 Typescript 转换为 JavaScript 之后,所有类型信息实际上都被剥离了。你可以很容易地通过在 Typescript Playground 中观察转译结果来检查它:https://www.typescriptlang.org/play/index.html#code/MYGwhgzhAEAqCmEAu0De0C+AoLAzArgHbBICWA9odAObxIDCAFqSACYBO8hAQgJ6y8ADvAA8saPAAeSLqxgJkAPgAUASgBccANoBdNFmiGjh4JWTRy+JIKvrYu6AF5ougNwHjR3OXbLThc2BmNgtcaCCWDi5VfU846FJcP2DWBICkMGJ4cjDYGNQPePjLaysAOhsIRmTI1Xci42wipqMWw04kfHYqEpskdwwgA

    如您所见,JavaScript 不知道您的 T 是什么,因此它无法检查它是否为实例。如果适合您的需要,您可能只需将child instanceof T 替换为child instanceof Test。否则,将需要一些额外的运行时检查(例如鸭子类型)。您可以使用用户定义的类型保护 (https://basarat.gitbook.io/typescript/type-system/typeguard#user-defined-type-guards)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2020-06-29
      • 1970-01-01
      • 2018-04-27
      • 2016-03-06
      相关资源
      最近更新 更多