【问题标题】:Typescript: is it ok to use enum as function parameter type?Typescript:可以使用枚举作为函数参数类型吗?
【发布时间】:2018-07-12 08:41:08
【问题描述】:

简单的问题,但我有疑问,找不到答案。

假设你有这个枚举:

export enum fooEnum {
    Foo = 'foo',
    Bar = 'bar'
}

那么这样输入我的函数参数可以吗?意思是'我希望收到一个字符串'foo'或'bar'作为参数,并希望返回'foo'或'bar'

function doStuff(myParam: FooEnum): FooEnum {
    return myParam;
};

【问题讨论】:

    标签: typescript enums


    【解决方案1】:

    使用enum 作为参数非常好。

    您可能要考虑的唯一事情(但在大多数情况下可以忽略不计)是enum 将包含在生成的JavaScript 中。

    export enum fooEnum {
        Foo = 'foo',
        Bar = 'bar'
    }
    

    将生成以下JavaScript 代码(或类似代码):

    var fooEnum;
    (function (fooEnum) {
        fooEnum["Foo"] = "foo";
        fooEnum["Bar"] = "bar";
    })(fooEnum || (fooEnum = {}));
    

    作为替代方案,您可以使用String Literal 类型,它不会包含在生成的代码中。

    export type fooType = 'foo' | 'bar';
    

    编辑 - 感谢 Aleksey L.

    您还可以定义一个const enum,它也不包含在生成的代码中。

    export const enum fooEnum {
        Foo = 'foo',
        Bar = 'bar'
    }
    

    当使用时

    var bar = fooEnum.Bar;
    

    以下代码将生成为

    var b = 'bar';
    

    const enum VS 字符串字面量类型

    使用const enum 方法,您是否找到它取决于个人喜好

    doStuff(fooEnum.Bar);
    

    或string literal 类型

    doStuff('bar');
    

    更具可读性。两种情况下生成的结果都是一样的。

    【讨论】:

    • 我喜欢这样!谢谢:)
    • @FlorentArlandis @Philipp 如果你不想生成对象,你可以定义const enum FooEnum...
    • @AlekseyL。谢谢,很高兴知道。你知道为什么会这样吗?
    • 这是在 typescript 规范中定义 const 枚举的方式。更多信息here
    【解决方案2】:

    enum 就像任何其他类型一样,它可以用作参数,也可以用作返回类型。所以是的,语法可以正常工作。

    我不知道为什么您需要传入 Enum 值,然后返回不同的 Enum 值,但您仍然可以做您正在做的事情,并且在 TypeScript 中是正确的。

    【讨论】:

    • 传入一个枚举并返回一个不同的枚举可能构成状态机实现的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2020-06-09
    • 2015-08-26
    相关资源
    最近更新 更多