假设我有一个界面Obj:
interface Obj {\n string1: string\n string2: string\n array1: SomeInterface[]\n array2: SomeOtherInterface[]\n}\nRun Code Online (Sandbox Code Playgroud)\n如何提取作为可区分联合类型扩展的接口的键?Obj[]
Obj上面给出的期望输出:
// "array1"\xc2\xa0|\xc2\xa0"array2"\nRun Code Online (Sandbox Code Playgroud)\n
您需要使用映射类型:
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
| 归档时间: |
|
| 查看次数: |
2728 次 |
| 最近记录: |