枚举上的静态方法

WOR*_*MSS 3 typescript

我一直在关注打字稿的声明合并,我复制了他们的示例,将枚举与某些函数合并,我所做的只是添加export到枚举中,现在我收到了错误。

export enum MyEnum {
  Point = 'Point',
  MultiPoint = 'MultiPoint',
}

namespace MyEnum {
  export function parse(val: string): Type {
    return MyEnum[val as keyof typeof MyEnum];
  }
}
Run Code Online (Sandbox Code Playgroud)

[ts] Individual declarations in merged declaration 'MyEnum' must be all exported or all local. [2395]

很公平,它想要全部或全部,所以我也导出名称空间。

export namespace Type { ... }
Run Code Online (Sandbox Code Playgroud)

我现在收到另一个错误。

[ts] Type 'MyEnum | ((val: string) => MyEnum)' is not assignable to type 'MyEnum'. Type '(val: string) => MyEnum' is not assignable to type 'MyEnum'. [2322]

我不太确定我是否正确理解该错误消息,但看起来它试图说 MyEnum 类型可以是 MyEnum 的值,或者函数显然失败,而且也不是我想要做的。

我还尝试删除导出function parse,但随后它就变得不可用。我尝试在各个地方添加“静态”,但似乎没有任何效果。

我目前想做的就是

const value: string = getString();
const pointType = MyEnum.parse(value);
Run Code Online (Sandbox Code Playgroud)

但我确实计划在未来拥有更先进的东西,只是想了解我做错了什么?

Tit*_*mir 6

在向枚举添加额外的成员(您正在添加parse方法)时,您更改了将生成的索引以及将生成enum的键。enum

keyof typeof MyEnum将会是"Point" | "MultiPoint" | "parse",所以它将包括额外的成员。

还将typeof MyEnum[keyof typeof MyEnum]包括MyEnum | ((val: string) => MyEnum)新成员签名。

您可以检查解析(您可能想要显式处理):

export enum MyEnum {
    Point = 'Point',
    MultiPoint = 'MultiPoint',
}

export namespace MyEnum {
    export function parse(val: string): MyEnum {
        const key = val as keyof typeof MyEnum
        if (key === 'parse') throw new Error("parse !");
        return MyEnum[key]
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以只使用排除的断言parse

export enum MyEnum {
    Point = 'Point',
    MultiPoint = 'MultiPoint',
}

export namespace MyEnum {
    export function parse(val: string): MyEnum {
        return MyEnum[val as Exclude<keyof typeof MyEnum, 'parse'>]
    }
}
Run Code Online (Sandbox Code Playgroud)