Typescript 枚举的静态方法

Typescript 枚举的静态方法,typescript,Typescript,我一直在关注typescript,我复制了他们的示例,将枚举与一些函数合并,我所做的只是将export添加到枚举中,现在出现了错误 export enum MyEnum { Point = 'Point', MultiPoint = 'MultiPoint', } namespace MyEnum { export function parse(val: string): Type { return MyEnum[val as keyof typeof MyEnum];

我一直在关注typescript,我复制了他们的示例,将枚举与一些函数合并,我所做的只是将
export
添加到枚举中,现在出现了错误

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

namespace MyEnum {
  export function parse(val: string): Type {
    return MyEnum[val as keyof typeof MyEnum];
  }
}
[ts]合并声明“MyEnum”中的单个声明必须全部导出或全部本地。[2395]

很公平,它要么想要全部,要么什么都不想要,所以我也导出了名称空间

export namespace Type { ... }
我现在得到另一个错误

[ts]
类型“MyEnum”|((val:string)=>MyEnum)不可分配给类型“MyEnum”。
类型'(val:string)=>MyEnum'不可分配给类型'MyEnum'。[2322]

我不确定我是否正确理解了该错误消息,但它似乎试图说MyEnum类型可以是MyEnum的值,或者函数显然失败了,也不是我想做的

我还试图从
函数parse
中删除导出,但随后它就变得不可用了。我尝试在不同的地方添加“static”,但似乎没有任何效果

我现在想做的就是

const value: string = getString();
const pointType = MyEnum.parse(value);

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

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

MyEnum类型的键将是
“点”|“多点”|“解析”
,因此它将包含额外的成员

另外
typeof MyEnum[keyof typeof MyEnum]
将是
MyEnum |((val:string)=>MyEnum)
,包括新成员签名

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

或者,您可以只使用一个排除
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'>]
    }
}
导出枚举MyEnum{
点='点',
多点='多点',
}
导出命名空间MyEnum{
导出函数解析(val:string):MyEnum{
将MyEnum[val作为排除返回]
}
}

谢谢。如果(key==parse.name)而不是
“parse”
,我是否需要执行
,这是因为缩微和类似的东西?还是我想得太多了?@worms无法缩小
键的类型。缩小不应影响公开导出成员的名称,通常为()
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'>]
    }
}