您遇到了字体的设计限制,如第microsoft/TypeScript#53368节所述
问题在于
type TTA<T extends Test> = Pick<Omit<T, "data">, "where">;
Omit<T, "data">
取决于判断generic类型T
的conditional type.(The Omit
utility type是用the Exclude
utility type实现的,the Exclude
utility type实现为条件类型.)而且这种类型对于类型判断器来说是出了名的难以分析.泛型条件类型对于编译器来说本质上是不透明的;它不能像人类那样计算不变量(另外,单词"Omit"
是对人类的暗示,而不是对编译器).因此,尽管人类可能会推断,对于所有T extends Test
,Omit<T, "data">
必须包含where
属性,因为T
包含where
属性,而Omit
不会删除它,编译器只是放弃,无法验证这一点.
解决错误在某种程度上是一个主观问题,即决定如何让编译器相信该属性是可接受的:
// like this
type TTB<T extends Test> = Pick<Omit<T, "data"> & { where?: any }, "where">;
// or maybe like this
type LoosePick<T, K extends PropertyKey> = Pick<T, K & keyof T>
type TTC<T extends Test> = LoosePick<Omit<T, "data">, "where">;
// et cetera
Playground link to code个