我很难将元素“ 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;
}
答案 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)。