【问题标题】:How do I enumerate options assigned to a type?如何枚举分配给类型的选项?
【发布时间】:2021-12-26 07:06:31
【问题描述】:

我正在使用的 Node.js 包有一个方法,该方法需要一个参数,该参数必须是通过 IntelliSense 可以看到的类型,该类型是使用 typescript 声明定义的,格式如下:

export declare type ArgType = 'A' | 'B' | 'C';

我想依次使用该参数的每个允许值来调用包方法;换句话说,某种形式的东西:

['A','B','C'].forEach((v) => packageObject.packageMethod(v));

除了我想避免硬编码选项列表的静态副本。

【问题讨论】:

  • 您希望如何提供选项列表?为什么包裹背后的奥秘是什么?似乎是一个奇怪的用例“使用每个允许的值调用包方法”,这是用于测试还是出于什么目的?
  • 这与typescript 有关吗?看起来是这样 - afaik,如果你想以编程方式对类型进行操作,你需要深入研究compiler api。但是,“每个值”通常可能不可行,例如想象一下。 number,你必须尝试 2**64 个值。
  • @ASDFGerte 是的,很好推断。如果它真的是一种异国情调的练习,那就太可惜了。在这种情况下,类型选项是对包访问的专有 Web API 使用的不同服务器的引用。我认为 IntelliSense 很容易为我提供作为自动完成的选项选择,因此认为以编程方式访问它们应该是适度可行的。
  • 这可能是要学习的新东西,但不是神秘的艺术——它是一个“api”,所以基础工作已经为你完成了。
  • 除非模块将它们作为值导出(例如,允许的字符串数组),否则您将不走运,必须自己对列表进行硬编码。 TypeScript 类型信息在运行时不可用。 (除非你使用 the reify-ts package 之类的东西来生成代码)

标签: javascript node.js typescript types


【解决方案1】:

如果你有能力修改包,你可以从字符串字面量的只读数组中导出字符串的并集,也可以导出数组以在运行时代码中使用:

TS Playground link

// exported as values (usable at runtime)
export const stringArgs = ['A', 'B', 'C'] as const;

// exported as union of strings (not usable at runtime)
export type ArgType = typeof stringArgs[number]; // "A" | "B" | "C"

export function fn (arg: ArgType): void {
  // ...
}

否则,您必须使用compiler API 解析值,如mentioned by @ASDFGerte

【讨论】:

  • 很遗憾我没有那个能力!但似乎合适的解决方案是包作者预期在运行时枚举的选项
  • 发送公关!遇到a similar situation recently,维护者很乐意合并。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 2020-08-16
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多