假设我有这种类型:
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