【问题标题】:Checking if string variable belongs to union type definition检查字符串变量是否属于联合类型定义
【发布时间】:2020-07-17 08:32:58
【问题描述】:

我有一个 type 定义,从不同的 npm 包中导入,包含 100 多个联合字符串,如下所示:

type SomeType = "a" | "b" | "c" \\ | ... and it goes and goes

如果一个字符串变量属于这个SomeType,我想检查我的代码。有没有办法做到这一点不需要需要我编写列出所有可能值的辅助函数 (as described here for instance)?

在我的情况下,列出所有值可能不是最好的,因为该 npm 包中的类型值将来可能会发生变化并且因为它们的负载很大。我正在寻找一些更聪明的方法,如果它存在的话。

【问题讨论】:

  • Typescript 类型/接口不会转译成代码,这意味着您想要做的检查是不可能的。更好的方法是将该类型定义为枚举,然后根据该枚举检查您的值
  • @MorShemesh:OP 写道,该类型来自不受他们控制的第三方包。他们不能将其更改为枚举。
  • 错过了 - 你是对的
  • 如果字符串是所描述的值之一,您是否要 typecheck 或在 runtime 期间检查,例如if 语句?
  • @zzrv 我需要在运行时进行。抱歉,不准确

标签: typescript types casting


【解决方案1】:

typescript goals 之一是对 javascript 输出执行完全类型擦除。

实际上(typescript v3.8)是文字类型的联合,例如:

type SomeType = "a" | "b" | "c";

不会转换为某种运行时值。

如果实现了proposal of spread operator on Union types 将填补这一空白。

与此同时,作为already suggested 对于上述问题,这是一个很好的建议:

要求这个第 3 方更改他们的库,以便这些联合类型 表示为枚举可以解决这个问题,因为枚举在运行时会生成一个双映射字典。

// type SomeType = "a" | "b" | "c";
enum SomeType {
  a,
  b,
  c,
}

let my_string = "a";
let isOk = SomeType.hasOwnProperty(my_string);

my_string = "z";
let isNotOk = SomeType.hasOwnProperty(my_string);

【讨论】:

    猜你喜欢
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2010-12-25
    • 2015-05-24
    • 2021-10-07
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多