- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在关注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/
我是一名优秀的程序员,十分优秀!