枚举的静态方法

时间:2018-12-11 12:12:52

标签: typescript

我一直在跟踪declaration-merging的打字稿,并复制了他们的示例,以将枚举与一些函数合并,而我所做的就是将export添加到枚举中,现在我得到了错误。

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

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

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

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

export namespace Type { ... }

我现在遇到另一个错误。

[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);

但是我确实计划在将来拥有更多高级功能,只是想了解我做错了什么?

1 个答案:

答案 0 :(得分:2)

在向枚举中添加一个额外的成员(您正在添加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]
    }
}

或者您可以只使用排除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'>]
    }
}