为什么我不能从已经省略的类型中忽略属性?

时间:2019-05-16 06:15:35

标签: typescript

我有一个简单的例子,就是从另一个已经省略的类型中省略属性:

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'>;

对我来说这不必要。

1 个答案:

答案 0 :(得分:2)

这是您定义Input的方式的限制,Omit必须是K。但是由于keyof T是一个无法解析的类型参数,因此无法确定T是否真的包含Omit<T, 'x'>(更像是不会打扰)的类型脚本。有多种方法可以解决此问题,但最简单的解决方案是使用z的定义,该定义将很快添加到打字稿3.5(PR)中,而无需Omit到{ {1}}

K