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

问题描述 投票:3回答:2

假设我有这种类型:

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

是否有可能从中提取IFoo

typescript typescript2.0
2个回答
4
投票

是。从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不匹配。


0
投票

为了完整性,还可以使用Exclude以及类型查询,从而产生非常可读的东西

interface IFoo { 
    name: string
}

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

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

type IFooExtracted = Exclude<ArrayValues, number> // IFoo
© www.soinside.com 2019 - 2024. All rights reserved.