TypeScript 查找/条件类型和联合

Def*_*mat 1 union typescript conditional-types

我有一个简单的问题:是否可以在 TypeScript 中获取联合的一部分的类型?

例如,您可以经常使用这样的查找类型:

interface Person {
  name: string;
}

type Name = Person['name']
Run Code Online (Sandbox Code Playgroud)

现在,我假设这样的工会是不可能的:

type Entity = 
    { __type: 'Company', name: string } 
  | { __type: 'Employee', firstName: string };
Run Code Online (Sandbox Code Playgroud)

那么,有没有什么办法可以获取工会的一部分呢?像这样的东西:

type Company = DoTheMagic<Entity, { __type: 'Employee' }> 

const company: Company = ...;

console.log(company.name) // OK
console.log(company.firstName) // Compile error
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 6

我们可以使用条件类型Extract<T, U>。如果T是联合,则结果Extract将是T满足约束的联合的所有成员U(又名,T extends U

type Company = Extract<Entity, { __type: 'Employee' }>  
// Same as
type Company = {
    __type: "Employee";
    firstName: string;
}
Run Code Online (Sandbox Code Playgroud)