【问题标题】:How to distinguish a string value from a string enum, without an extra lookup?如何在没有额外查找的情况下区分字符串值和字符串枚举?
【发布时间】:2020-06-26 08:33:28
【问题描述】:

在接口定义中,我使用 src 成员作为图标,它可以是字符串(用于图像路径)或预定义图标(名称):

interface IIconProperties {
    src?: string | Codicon;
}

export enum Codicon {
    add = "add",
}

现在在渲染时,我必须根据值生成不同的输出。但由于两者实际上都是字符串,我无法区分它们:

if (typeof src === "string") {
    // Always taken.
} else {
    // Never hit.
}

所以我试图以某种方式识别枚举(src instanceof enumtypeof src === "enum"),这是无效的语法。我可以做些什么来区分这两种类型,而不必使用单独的查找图(当我在枚举中使用数字而不是字符串时)?

【问题讨论】:

  • 类型系统只存在于编译时。在运行时(当typeof src === "string" runs) then none of the types exist. You can see that in the compiled code src` 将有its type erased 并且它是一个普通的JavaScript 变量。它不会知道TypeScript 结构。也可能感兴趣:How do the different enum variants work in TypeScript?
  • 但是,您仍然可以检查其他类型,例如类的实例。因此,在运行时不会有类似的东西并不完全正确。但是感谢您的链接。
  • 是不同的,因为它们不是纯粹的类型系统构造——它们存在于运行时。毕竟,您可以调用在运行时处理的new MyClass()。此外,您将使用instanceof operator 检查作为 JavaScript 一部分的类,并将检查给定值是否是给定对象的实例。所有这些东西在运行时已经存在,所以类型擦除不会影响它们。

标签: typescript


【解决方案1】:

问题是:你不能。 enum 不是 Javascript 类型,所以你永远无法知道它的编译时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多