打字稿泛型类型比较不起作用

时间:2020-07-03 10:14:52

标签: typescript typescript-generics typescript3.8

我很难将元素“ child”与泛型T进行比较,并且仅返回这些类型化child的数组。 逻辑很简单,我有一个包含不同元素的子元素数组,这些元素都继承自“ Test”类型。我只想要“特殊”孩子的子集。 我现在似乎能够找到一种解决方案,以任何方式将泛型T与子代进行比较。

产生的错误是TS2693:“ T”仅引用类型,但在此处被用作值。

我用instanceof,typeof,Object.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;
}

1 个答案:

答案 0 :(得分:0)

问题在于,将Typescript转换为JavaScript后,实际上会剥离所有类型信息。您只需在Typescript游乐场中观察转译的结果即可轻松检查:https://www.typescriptlang.org/play/index.html#code/MYGwhgzhAEAqCmEAu0De0C+AoLAzArgHbBICWA9odAObxIDCAFqSACYBO8hAQgJ6y8ADvAA8saPAAeSLqxgJkAPgAUASgBccANoBdNFmiGjh4JWTRy+JIKvrYu6AF5ougNwHjR3OXbLThc2BmNgtcaCCWDi5VfU846FJcP2DWBICkMGJ4cjDYGNQPePjLaysAOhsIRmTI1Xci42wipqMWw04kfHYqEpskdwwgA

如您所见,JavaScript不知道您的require('dotenv').config()是什么,因此它无法检查它是一个实例。如果适合,您可以将T替换为child instanceof T。否则,将需要一些其他的运行时检查(例如,鸭式打字)。您可以使用用户定义的类型防护(https://basarat.gitbook.io/typescript/type-system/typeguard#user-defined-type-guards)。