/**/

我有这样一种类型:

type Entity =
  | {
      type: 'user' | 'person';
      id: string;
    }
  | {
      type: 'animal';
      id: number;
    };

现在,我想从其中提取类型:

type Animal = Extract<Entity, {type: 'animal'}>-工作正常(返回{ type: 'animal'; id: number; });

type User = Extract<Entity, {type: 'user'}>-返回never.

我怎么才能让它返回{ type: 'user'; id: string; }? ?

推荐答案

提供的Extract<T, U>人的文件中写道:

从T中提取可赋值给U的类型

{ type: 'user' | 'person', id: string }不能赋值给{ type: 'user' }

declare const entity: Entity
const user: { type: 'user' } = entity
/*
Type 'Entity' is not assignable to type '{ type: "user"; }'.
  Type '{ type: "user" | "person"; id: string; }' is not assignable to type '{ type: "user"; }'.
    Types of property 'type' are incompatible.
      Type '"user" | "person"' is not assignable to type '"user"'.
        Type '"person"' is not assignable to type '"user"'.(2322)
*/

这意味着你不能用Extract来做这件事.


但您可以做的是使用交叉点(&),它将删除该判别式无法匹配的任何联合成员.

type User = Entity & { type: 'user' }

const user: User = { type: 'user', id: 'abc' }
user.id // type: string

See Playground

Typescript相关问答推荐

为什么品牌字符串/数字类型使 DeepWriteable 不再扩展字符串/数字?

在 Typescript 中获取深层嵌套类型

如何根据键将函数的参数键入为对象值

为什么在 union 中使用的对象的属性的类型是 any?

函数中无法识别 props 中的类型限制

如何实现更好的通用推理

Typescript 没有注意到 Partial> 如果有必需的密钥,则密钥可能不存在

如何让接口包含子类型同时本身也是有效类型

从 const Object 生成映射类型

根据函数参数类型动态映射函数输出类型

为什么第二次订阅会改变我的直播结果?

是否可以创建一种递归强制值的类型?

如何使用 puppeteer 操作 mat-slider 值

在Typescript 泛型类型声明中遇到问题

在 TypeScript 中,为什么当 noImplicitAny 为 true 时将空数组推断为“any[]”,而当它为 false 时推断为“never[]”?

将数组参数类型映射到数组返回类型?

SolidJS 路由 useNavigate() 抛出:错误:确保您的应用程序包装在

泛型函数的返回类型

类型上不存在属性/不能用作索引类型

如何以编程方式在Angular项目中使用 bootstrap 图标?