gpt4 book ai didi

typescript 枚举通用映射

转载 作者:行者123 更新时间:2023-12-03 22:15:31 24 4
gpt4 key购买 nike

Helo Stack 社区,
我有以下 enum映射类:

export class RestEnumMpapper<T> {

constructor() {}

getEnumAsString<T>(o: T, key: string | number): string {
if (typeof key === 'string') {
return (o as T)[(o as T)[key]];
} else if (typeof key === 'number') {
return (o as T)[key];
} else {
throw new Error(`Unable to parse enum from ${typeof(key)}`);
}
}
/* ... Rest of enum converting class code ... */
}

典型用例如下:
    export class PositionEvent {
private static statusEnumMapper: RestEnumMpapper<EventState> = new RestEnumMpapper<EventState>();
/* ... */
this.status = PositionEvent.statusEnumMapper.getEnumAsString(EventState, iPos.status) as EventState;
}

它工作得很好,但我目前正在整理我的代码,并且 linter 提示阴影泛型类型 TRestEnumMpapper在这里上课:
export class RestEnumMpapper<T> {

和这里:
getEnumAsString<T>(o: T, key: string | number): string {

将泛型类型保留为类类型是合理且有意义的。但是,当我放弃时 T关于每次调用的函数声明,我都在关注 TypeScritp错误:

[ts] Argument of type 'typeof EventState' is not assignable to parameter of type 'EventState'.



它可以通过传递枚举(或任何其他普通数字)的值来强制工作,但在尝试解析像 2[3] 这样的语句时,函数显然失败了。 .
我会很感激任何建议如何解决这个问题?在函数 TypeScritp 中删除泛型类型之前,以某种方式能够将 T 解析为具有属性的对象,并且仅枚举名称就足以工作。

最佳答案

发生这种情况是因为您没有将枚举的值传递给函数,该函数的类型为 EventState而是包含类型为 typof EventState 的枚举的对象.所以从方法中删除类型参数,但传入 typeof EventState到类(class)应该可以正常工作:

let statusEnumMapper = new RestEnumMpapper<typeof EventState>();

我还可以建议,如果该类与似乎是这样的单个枚举相关联,您不妨将其传递给构造函数,并将索引签名添加到 T允许在不强制转换的情况下进行索引:
export class RestEnumMpapper<T extends { [name: string]: any }> {

constructor(public enumObject: T) { }

getEnumAsString(key: string | number): string {
if (typeof key === 'string') {
return this.enumObject[this.enumObject[key]];
} else if (typeof key === 'number') {
return this.enumObject[key];
} else {
throw new Error(`Unable to parse enum from ${typeof (key)}`);
}
}
/* ... Rest of enum converting class code ... */
}

enum EventState {
Test = "Test",
One = "One",
}

let statusEnumMapper = new RestEnumMpapper(EventState);
let statusStr = "One";
let status = statusEnumMapper.getEnumAsString(statusStr) as EventState;

关于 typescript 枚举通用映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51131365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com