【问题标题】:TypeScript Union Types number or specific stringTypeScript Union Types 数字或特定字符串
【发布时间】:2017-03-29 09:21:29
【问题描述】:

我正在尝试使用 typeScript 联合类型。 我有一个具有数字属性的类,但我希望它具有三种特殊情况:Infinity、None 和 Auto

Infinity 和 None 可以分别用Number.POSITIVE_INFINITYNULL 表示,但我不知道如何处理自动值。

这个值最初来自一个以字符串表示的 XML 文档。例如<element myValue="123"/><element myValue="-4096"/><element myValue="infinity"/><element myValue="auto"/><element/>

如何创建一个可用作数字但仍具有 auto 值的联合类型。我想到了一个带有 number 和 Enum 的联合类型,但我不确定如何充分利用它。

有什么建议吗?

class MyClass {
    name: string;
    duration: number; // Want to support None/Null, Infinity and Auto
}

【问题讨论】:

    标签: typescript types typescript2.0 union-types


    【解决方案1】:

    但我不知道如何处理自动值

    我们也不会。您需要举一个自动值的示例,例如1 是一个有效的 auto 值。我怀疑是这样,而且我怀疑 所有 数字都是有效的。所以我会使用类型注释duration : number | null

    【讨论】:

    • 1 不是自动值。 Auto 是它自己的值,它应该触发特殊的逻辑,所以我需要像使用“null”一样使用“auto”作为值。 Michael Liu 的回答看起来像我所需要的。
    【解决方案2】:

    考虑在你的类型注解中使用字符串文字'auto'

    class MyClass {
        name: string;
        duration: number | undefined | 'auto';
    }
    

    (这里我使用undefined而不是null来表示缺失值。如果您还没有使用TypeScript 2.0,请省略undefined。)

    此类型注释允许您将数字(包括Number.POSITIVE_INFINITY)、undefined'auto' 分配给duration,但不能分配任何其他字符串。

    示例用法:

    var c = new MyClass();
    // ...
    
    if (c.duration === undefined) {
        // ...
    } else if (c.duration === 'auto') {
        // ...
    } else {
        // In this branch, the type of c.duration will be number.
        // ...
    }
    

    【讨论】:

    • 这看起来棒极了!正是我想要的!我之前研究过字符串文字,但我得到了编译器错误。也许我正在使用旧版本的打字稿编译器。将考虑升级到 TypeScript 2.0。
    • @user3336731:TypeScript 1.8 中引入了字符串字面量类型。
    猜你喜欢
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2018-07-05
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2020-01-29
    相关资源
    最近更新 更多