【问题标题】:TypeScript compiler API - Extract the type of union type tupleTypeScript 编译器 API - 提取联合类型元组的类型
【发布时间】:2020-09-22 23:41:57
【问题描述】:

如果我有一个string[] 类型的数组并且我想从数组中提取类型,我必须这样做:

const typeArgs = type.typeArguments;
typeArgs[0]; // string

但是,如果我有一个 [number, string] 类型的元组并想要获得 string | number 的类型联合呢?

【问题讨论】:

  • 获取类型联合是什么意思?我假设您的意思是获取元组类型的各个元素类型?
  • 下面的例子const arr: [string, number] = ['a', 1]arr.map (el => el)我需要提取el类型。

标签: typescript typescript-compiler-api


【解决方案1】:

获取元组类型的单个元素类型与获取数组类型的元素类似——使用typeArguments 属性:

const [numberType, stringType] = type.typeArguments;

下面的例子const arr: [string, number] = ['a', 1]; arr.map(el => el)我需要提取el类型。

如果您有权访问 el 节点,那么您可以获取它并询问它的类型是什么 (TypeChecker#getTypeAtLocation)。如果您无权访问,据我所知,无法使用编译器 API 创建 Type 对象。相反,我建议您根据 typeArguments 属性创建您自己的转换表示,并在您的代码中使用它。

【讨论】:

  • 这正是我要找的,numberTypeSymbol 类型为 number。我需要一个string | number 类型的符号。 stringnumber 类型仅用于示例。元组可以是任何类型 [T, K, E] => T | ķ | E
  • 据我所知,编译器 API 无法创建 Type 对象......有转换 API 来转换 AST,但这是不同的。我建议创建您自己的转换表示,并在您的代码中使用它,而不是基于typeArguments 属性。旁注:typeArguments 属性包含类型,因此numberType 是类型而不是符号。
猜你喜欢
  • 2020-09-08
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2017-01-03
相关资源
最近更新 更多