请考虑以下事项:

type U = {a: string, b: string};

type T = U & ({c: string, d?: never}|{c?: never, d: string});
type E = Exclude<T, {a: string}>;
type O = Omit<T, "a">;

const t1: T = {a: "a", b: "b", c: "c", d: "d"}; // error - expected
const t2: T = {a: "a", b: "b", c: "c"}; // ok - expected
const t3: T = {a: "a", b: "b", d: "d"}; // ok - expected

const e1: E = {b: "foo", c: "c", d: "d"}; // error - expected
const e2: E = {b: "foo", c: "c"}; // error: E is never
const e3: E = {b: "foo", d: "d"}; // error: E is never

const o1: O = {b: "foo", c: "c", d: "d"}; // ok - unexpected!
const o2: O = {b: "foo", c: "c"}; // ok
const o3: O = {b: "foo", d: "d"}; // ok

类型T被定义为包含属性ab的对象andcd,但not两者都包含.

我正在try 构造一个与T except相同的类型,它没有a属性.我try 了ExcludeOmit,从上面可以明显看出,这两种方法都不能满足我的需求.

有没有一种方法可以在不事先知道类型T的 struct 的情况下,从类型T的黑盒中删除一个属性,并保持它的其他所有内容不变?

还打字here个操场.

Edit:修复了原始类型;添加了更多测试用法

Edit #2:这道题与Typescript: Omit a property from all interfaces in a union, but keep the union structure题不同,因为:

  • 所讨论的类型不是直线并集,而是一侧包含并集的交集
  • 它还解决了从任意"黑盒"类型中删除的属性而不更改其任何其他语义的问题.

推荐答案

OmitExclude在简单类型(不需要联合或其他复杂组合的类型)上都可以很好地工作

当基类型包含联合时,它在类型脚本中称为Distributive conditional types

一个有效的示例是,按照提供的操场进行操作,如下所示:

type DistributiveOmit<T, K extends keyof any> = T extends any
  ? Omit<T, K>
  : never;


type U = {a: string, b: string};

type T = U & ({c: string, d?: never}|{c?: never, d: string});
type D = DistributiveOmit<T, "a">;

const d1: D = {b: "foo", c: "c", d: "d"}; // error - expected
const d2: D = {b: "foo", c: "c"}; // ok
const d3: D = {b: "foo", d: "d"}; // ok

你可以在here号playground 看到它工作

Typescript相关问答推荐

如何正确修复TypScript 4.7到4.8升级中的TS 2345编译错误

如何在方法中定义TypeScript返回类型,以根据参数化类型推断变量的存在?

如何将联合文字类型限制为文字类型之一

打印脚本丢失函数的泛型上下文

在Typescript 中,有没有`index=unfined的速记?未定义:某个数组[索引]`?

记录键的泛型类型

已解决:如何使用值类型限制泛型键?

AngularJS服务不会解析传入的Json响应到管道中的模型

垫表页脚角v15

复选框Angular 在Ngfor中的其他块中重复

如何避免从引用<;字符串&>到引用<;字符串|未定义&>;的不安全赋值?

使用或属性编写无限嵌套的接口

如何键入派生类的实例方法,以便它调用另一个实例方法?

棱角分明-什么是...接口类型<;T>;扩展函数{new(...args:any[]):t;}...卑鄙?

如何正确键入泛型相对记录值类型?

从联合提取可调用密钥时,未知类型没有调用签名

是否使用类型将方法动态添加到类?

递归JSON类型脚本不接受 node 值中的变量

如何键入仅在包含特定子类型时才接受联合类型的函数?

TypeScript 无法使用 keyof 泛型参数作为对象的键