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

And*_*sby 5 typescript

假设我有一个界面Obj

\n
interface Obj {\n  string1: string\n  string2: string\n  array1: SomeInterface[]\n  array2: SomeOtherInterface[]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如何提取作为可区分联合类型扩展的接口的键?Obj[]

\n

Obj上面给出的期望输出:

\n
// "array1"\xc2\xa0|\xc2\xa0"array2"\n
Run Code Online (Sandbox Code Playgroud)\n

cap*_*ian 7

您需要使用映射类型

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"
Run Code Online (Sandbox Code Playgroud)

操场

ObtainKeys是一个通用的 util,它需要两个参数。第一个是您要检查的对象,第二个是您要提取的类型。

此行:[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