【发布时间】:2020-11-20 06:16:11
【问题描述】:
我基于 TypeScript 的 Nodejs 项目中的依赖项的例行更新导致我在用于管理 mongoose 模型的通用类中收到 TypeScript 编译错误。我已将问题缩小到似乎是 TypeScript 处理泛型类型的问题。
我构建了以下最小示例:
interface I {
p: string;
}
class Foo<T extends I> {
exclude: Exclude<'p', 'q'> = 'p'; // OK
excludeI: Exclude<keyof I, 'q'> = 'p'; // OK
excludeT: Exclude<keyof T, 'q'> = 'p'; // TS2322: Type '"p"' is not assignable to type 'Exclude<keyof T, "q">'.
}
请注意excludeI(编译良好)和excludeT(编译失败并出现给定错误)类型之间的唯一区别是后者使用泛型类型T而不是接口类型I.
由于T 被指定为扩展I,我希望这两行得到相同的处理。事实上,keyof 运算符似乎可以互换使用它们:
class Foo<T extends I> {
keyof: 'p' = 'p'; // OK
keyofI: keyof I = 'p'; // OK
keyofT: keyof T = 'p'; // OK
}
我曾使用this example on the TypeScript Playground 尝试过不同的 TS 版本,它似乎不是版本依赖的行为。
谁能在这里解释一下Exclude<> 发生了什么?
【问题讨论】:
-
github.com/microsoft/TypeScript/issues/33484 这似乎实际上是打字稿的问题,但不知道如何解决它
-
感谢@AlexChashin 的链接,如果不是相同的问题,它肯定似乎是密切相关的。仍然不确定
keyof如何按预期工作,但随后Exclude不会。 -
请注意,在您的操场示例中,您的
extendsXX类型与使用Exclude的类型不同;后者是 distributive condtional type 但你的extendsXX类型不是。
标签: typescript typescript-generics