我有一个简单的例子,就是从另一个已经省略的类型中省略属性:
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
interface A {
x: string;
y: number;
}
interface B extends A {
z: Date;
w: boolean;
}
type OmitA<T extends A> = Omit<T, 'x'>;
type OmitB<T extends B> = Omit<OmitA<T>, 'z'>;
OmitA类型仅具有预期的属性“ y”。但是OmitB类型会引发错误:
Type '"z"' does not satisfy the constraint 'Exclude<keyof T, "x">'. ts(2344)
这是错误还是此代码有问题?
更新1
如果将OmitB类型更改为:
type OmitB<T extends B> = Omit<OmitA<T & B>, 'z'>;
对我来说这不必要。
答案 0 :(得分:2)
这是您定义Input
的方式的限制,Omit
必须是K
。但是由于keyof T
是一个无法解析的类型参数,因此无法确定T
是否真的包含Omit<T, 'x'>
(更像是不会打扰)的类型脚本。有多种方法可以解决此问题,但最简单的解决方案是使用z
的定义,该定义将很快添加到打字稿3.5(PR)中,而无需Omit
到{ {1}}
K