typescript - 枚举的静态方法

标签 typescript

我一直在关注declaration-merging对于 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] 输入“我的枚举 | ((val: string) => MyEnum)' 不可分配给类型 'MyEnum'。 类型 '(val: string) => MyEnum' 不可分配给类型 'MyEnum'。 [2322]

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

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

我现在要做的就是

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

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

最佳答案

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

keyof typeof MyEnum 将是 "Point"| “多点” | “解析”,因此它将包含额外的成员。

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'>]
    }
}

关于typescript - 枚举的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53723982/

相关文章:

javascript - 在搜索类型定义时何时使用环境?

typescript - Angular2 HTTP GET - 将响应转换为完整对象

angular - 在 typescript 中定义抽象类的类型

javascript - 在 Typescript 中输入函数包装器

typescript - 在 TypeScript 中,如何定义提供从成员对象返回的值的方法类型?

javascript - 如何使用装饰器扩展类类型

typescript - 如何使用 package.json 中的 typesVersions 字段为较新的 typescript 版本提供更严格的类型?

javascript - 我无法使用 'disabled' 属性禁用 anchor

reactjs - 类型中缺少属性 onAuxClickCapture 和 onAuxClick

javascript - Maquette 修改后如何更新 DOM