如何从联合中提取单一类型?

How to extract single Type from a union?

假设我有这种类型:

type FooArray = IFoo[] | number[] | undefined

是否可以从中提取 IFoo

是的。由于 TypeScript 2.8 supports conditional types 你可以这样做:

interface IFoo { 
    name: string
}

type FooArray = IFoo[] | number[] | undefined

type FindType<TWhere> = TWhere extends (infer U)[] ? (U extends object ? U : never) : never

type FoundType = FindType<FooArray> // FoundType == IFoo

请注意,U extends object ? U : never 是必需的,因此 number 不匹配。

为了完整性 Exclude 也可以使用类型查询,从而产生可读性很好的东西

interface IFoo { 
    name: string
}

type FooArray = IFoo[] | number[]  | undefined

type ArrayValues = Exclude<FooArray, undefined>[number] // IFoo | number

type IFooExtracted = Exclude<ArrayValues, number> // IFoo