打字稿:可以使用枚举作为函数参数类型吗?

Flo*_*dis 3 enums typescript

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

假设你有这个枚举:

export enum fooEnum {
    Foo = 'foo',
    Bar = 'bar'
}
Run Code Online (Sandbox Code Playgroud)

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

function doStuff(myParam: FooEnum): FooEnum {
    return myParam;
};
Run Code Online (Sandbox Code Playgroud)

Phi*_*ipp 5

使用enumas 参数完全没问题。

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

export enum fooEnum {
    Foo = 'foo',
    Bar = 'bar'
}
Run Code Online (Sandbox Code Playgroud)

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

var fooEnum;
(function (fooEnum) {
    fooEnum["Foo"] = "foo";
    fooEnum["Bar"] = "bar";
})(fooEnum || (fooEnum = {}));
Run Code Online (Sandbox Code Playgroud)

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

export type fooType = 'foo' | 'bar';
Run Code Online (Sandbox Code Playgroud)

编辑- 感谢 Aleksey L.

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

export const enum fooEnum {
    Foo = 'foo',
    Bar = 'bar'
}
Run Code Online (Sandbox Code Playgroud)

并且在使用时

var bar = fooEnum.Bar;
Run Code Online (Sandbox Code Playgroud)

以下代码将生成为

var b = 'bar';
Run Code Online (Sandbox Code Playgroud)

const 枚举 VS 字符串文字类型

这种const enum方法归结为个人喜好

doStuff(fooEnum.Bar);
Run Code Online (Sandbox Code Playgroud)

string literal类型

doStuff('bar');
Run Code Online (Sandbox Code Playgroud)

更具可读性。在这两种情况下生成的结果将是相同的。