假设我有一个接口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]
为了得到我们所有的值迭代类型,因为希望Prop
value
never
地点和任何类型的联盟——回报你同样没有never
我想补充一下,这种语法也可以用于相同的用例:
type ObtainKeys<T, V> = keyof {
[K in keyof T as T[K] extends V ? K : never]: any
}