我想提出一些条件来仅从值为数组的对象中提取属性。
例如:
type Person = {
name: string
addresses: Address[]
age: number
phoneNumbers: PhoneNumber[]
}
PullOutArrays<Person> => {
phoneNumbers: PhoneNumber[]
addresses: Address[]
}
Run Code Online (Sandbox Code Playgroud)
我尝试过这样的事情但没有成功:
type PulledOutArrays<T extends Record<string, unknown>> = {
[K in keyof T]: T[K] extends unknown[] ? T[K] : never
}
Run Code Online (Sandbox Code Playgroud)
抄袭这个 GitHub 问题:
type FilteredKeys<T, U> = { [P in keyof T]: T[P] extends U ? P : never }[keyof T];
type FilteredProperties<T, U> = { [K in FilteredKeys<T, U>]: T[K]; };
type PullOutArrays<T> = FilteredProperties<T, unknown[]>;
type Person = {
name: string
addresses: string[]
age: number
phoneNumbers: number[]
}
type PersonKeys = FilteredKeys<Person, unknown[]>;
// "addresses" | "phoneNumbers"
type PersonArrays = PullOutArrays<Person>;
// {
// addresses: string[];
// phoneNumbers: number[];
// }
Run Code Online (Sandbox Code Playgroud)
正如您可能从最初的尝试中看到的那样,映射条件后最终会得到什么:
{ [P in keyof T]: T[P] extends U ? P : never }
Run Code Online (Sandbox Code Playgroud)
是一个包含所有属性键的接口,但非数组类型更改为never,显然是因为 TS 最初并不检查分配给属性键的类型是什么。通过在末尾添加索引,可以强制编译器读取属性的值并最终从结果中忽略它。
使用生成的联合,您可以在原始接口上从该联合创建新的映射类型。
| 归档时间: |
|
| 查看次数: |
2431 次 |
| 最近记录: |