给定以下类型:
type Person = {
name: string;
};
type Family = {
parent: Person;
children: Person[];
};
我想定义另一种Aggregated<T>
会自动生成以下类型的类型:
type FamilyAggregatedExpected = {
parent: Person[];
children: Aggregated<Person>[];
};
那是:
Aggregated<T>
我在使用列表属性时遇到困难。
到目前为止,我已经尝试过:
export type Aggregated<T> = {
[key in keyof T]: T[key] extends any[] ? Aggregated<any>[] : T[key][];
};
但这不会键入Aggregated
type参数。尝试解决此问题:
export type Aggregated<T,U = never> = {
[key in keyof T]: T[key] extends U[] ? Aggregated<U>[] : T[key][];
};
不能像extends U[]
往常一样失败。
如何提取列表元素类型,以便将其传递给Aggregated<T>
?
Stackblitz:https://stackblitz.com/edit/so-conditional-types ? file = index.ts
有几种方法可以做到这一点;似乎最接近您的方法的一种方法是使用声明来获取条件类型的类型推断infer
:
type Aggregated<T> = {
[K in keyof T]: T[K] extends Array<infer U> ? Aggregated<U>[] : T[K][];
};
对于的键K
中的每个属性键T
,我们检查是否T[K]
为类型数组Array<infer U>
。如果是这样,U
它将是数组的元素类型,我们可以Aggregated
根据需要将其传递给。让我们确保它有效:
type FamilyAggregated = Aggregated<Family>
/* type FamilyAggregated = {
parent: Person[];
children: Aggregated<Person>[];
} */
看起来不错。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句