使用条件类型时,如何获取列表属性的类型?

沃尔夫

给定以下类型:

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][];
};

但这不会键入Aggregatedtype参数。尝试解决此问题:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用反射获取列表属性类型

来自分类Dev

如何使用条件类型分配使类型取决于属性值

来自分类Dev

如何使用反射递归获取类型的属性?

来自分类Dev

如何获取节俭类型的属性?

来自分类Dev

如何获取节俭类型的属性?

来自分类Dev

使用TypeScript时获取类型的属性不存在错误

来自分类Dev

从通用类获取ICollection类型的属性的列表

来自分类Dev

如何使用System.Reflection.Metadata获取属性类型?

来自分类Dev

如何使用镜像获取Dart中类的属性的类型?

来自分类Dev

如何使用反射从动态(匿名类型)对象获取属性?

来自分类Dev

如何使用反射从动态(匿名类型)对象获取属性?

来自分类Dev

如何使用镜像获取Dart中类的属性的类型?

来自分类Dev

如何使用Where子句获取实体类型的列表

来自分类Dev

如何使用反射获取特定类型的通用列表

来自分类Dev

使用Cloud Datastore API时如何指定属性类型

来自分类Dev

如何获取类型的类型?

来自分类Dev

泛型:使用super时如何获取类型以供重用?

来自分类Dev

Datagridview:如何从列表中“类型转换”属性

来自分类Dev

从boto3获取对象列表时,如何排除文件名或文件类型列表?

来自分类Dev

使用DeepEquals忽略列表类型的属性

来自分类Dev

如何获取对象属性的类型提示?

来自分类Dev

AngularJS:如何从任意类型获取属性?

来自分类Dev

如何从地图的内容对象获取属性类型

来自分类Dev

如何获取集合中每个属性的“类型”?

来自分类Dev

如何从类型列表中获取泛型类型

来自分类Dev

使用通用类型对象的反射获取属性

来自分类Dev

匿名类型的属性列表

来自分类Dev

使用平面列表时,元素类型无效

来自分类Dev

获取列表的类型

Related 相关文章

  1. 1

    使用反射获取列表属性类型

  2. 2

    如何使用条件类型分配使类型取决于属性值

  3. 3

    如何使用反射递归获取类型的属性?

  4. 4

    如何获取节俭类型的属性?

  5. 5

    如何获取节俭类型的属性?

  6. 6

    使用TypeScript时获取类型的属性不存在错误

  7. 7

    从通用类获取ICollection类型的属性的列表

  8. 8

    如何使用System.Reflection.Metadata获取属性类型?

  9. 9

    如何使用镜像获取Dart中类的属性的类型?

  10. 10

    如何使用反射从动态(匿名类型)对象获取属性?

  11. 11

    如何使用反射从动态(匿名类型)对象获取属性?

  12. 12

    如何使用镜像获取Dart中类的属性的类型?

  13. 13

    如何使用Where子句获取实体类型的列表

  14. 14

    如何使用反射获取特定类型的通用列表

  15. 15

    使用Cloud Datastore API时如何指定属性类型

  16. 16

    如何获取类型的类型?

  17. 17

    泛型:使用super时如何获取类型以供重用?

  18. 18

    Datagridview:如何从列表中“类型转换”属性

  19. 19

    从boto3获取对象列表时,如何排除文件名或文件类型列表?

  20. 20

    使用DeepEquals忽略列表类型的属性

  21. 21

    如何获取对象属性的类型提示?

  22. 22

    AngularJS:如何从任意类型获取属性?

  23. 23

    如何从地图的内容对象获取属性类型

  24. 24

    如何获取集合中每个属性的“类型”?

  25. 25

    如何从类型列表中获取泛型类型

  26. 26

    使用通用类型对象的反射获取属性

  27. 27

    匿名类型的属性列表

  28. 28

    使用平面列表时,元素类型无效

  29. 29

    获取列表的类型

热门标签

归档