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

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

我觉得没必要。

最佳答案

这是您定义 Omit 方式的限制, K必须是 keyof T .但是因为 T是一个未解析的类型参数 typescript 无法确定是否 Omit<T, 'x'>将真正包含 z (更像是它不打扰)。有办法解决这个问题,但最简单的解决方案是使用 Omit 的定义。这将很快添加到不需要 K 的 typescript 3.5 ( PR) 中至 extend keyof T

type Omit<T, K> = Pick<T, Exclude<keyof T, K>>; // no constraint as in the new Omit in 3.5

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'>; // works fine now

关于typescript - 为什么我不能从已经省略的类型中省略属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56161918/

相关文章:

reactjs - 如何限制用户不使用带有反应和 typescript 的输入类型文件选择其他文件类型?

javascript - Nightmare.js 屏幕截图缓冲区长度为 0

javascript - 替换 typescript 中字符串中的所有字符实例?

javascript - 如何组合两个返回 Rx Observables 的相似 http 请求?

javascript - 无法从路径导入 IonicModule

reactjs - React Hook 在状态更改后不会重新渲染 array.map

TypeScript 联合作为函数参数

javascript - 为什么我无法减少数组?

typescript - 是否可以为方法装饰器选项提供类型安全

javascript - 如何声明对运行时 JavaScript 包中可用的现有命名空间的引用