如何从对象中提取某种类型的键



假设我有一个接口Obj:

interface Obj {
string1: string
string2: string
array1: SomeInterface[]
array2: SomeOtherInterface[]
}

如何提取扩展[]为判别联合类型的接口Obj?

给定Obj的期望输出:

// "array1" | "array2"

您需要使用映射类型:

type SomeInterface = { tag: 'SomeInterface' }
type SomeOtherInterface = { tag: 'SomeOtherInterface' }
interface Obj {
string1: string
string2: string
array1: SomeInterface[]
array2: SomeOtherInterface[]
}
type ObtainKeys<Obj, Type> = {
[Prop in keyof Obj]: Obj[Prop] extends Type ? Prop : never
}[keyof Obj]
type GetArrayKeys = ObtainKeys<Obj, Array<any>> // "array1" | "array2"
type GetStringKeys = ObtainKeys<Obj, string> //  "string1" | "string2"

游乐场

ObtainKeys是一个通用的实效,预计两个参数。第一个是要检查的对象,第二个是要提取的类型。

这一行:[Prop in keyof Obj]: Obj[Prop] extends Type ? Prop : never遍历所有Obj键并检查Obj[Prop]是否扩展了所需的类型。请记住,Obj[Prop]是一个值而不是键。因此,如果Obj[Prop]满足要求-返回Prop,否则-never

我用[keyof Obj]为了得到我们所有的值迭代类型,因为希望Propvaluenever地点和任何类型的联盟——回报你同样没有never

我想补充一下,这种语法也可以用于相同的用例:

type ObtainKeys<T, V> = keyof {
[K in keyof T as T[K] extends V ? K : never]: any
}

最新更新