[英]Typescript enum generic mapping
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抱怨這里的RestEnumMpapper
類中的通用類型T
RestEnumMpapper
了:
export class RestEnumMpapper<T> {
和這里:
getEnumAsString<T>(o: T, key: string | number): string {
將通用類型保留為類類型是合理的並且有意義的。 但是,當我在每次調用時在函數聲明上放下T
時,都會收到以下TypeScritp
錯誤:
[ts]類型'EventState'的參數不能分配給'事件狀態'的參數。
可以通過傳遞枚舉值(或任何其他普通數字)來強制工作,但是在嘗試解析2[3]
類的語句時,函數顯然會失敗。
如果有任何建議解決此問題,我將不勝感激。 在將泛型類型放入函數中之前,TypeScritp能夠以某種方式將T解析為具有屬性的對象,並且僅枚舉名稱就足夠了。
發生這種情況是因為您沒有將枚舉的值傳遞給該函數,該枚舉的類型EventState
,而是將包含枚舉的對象的類型為typof EventState
。 因此,從方法中刪除類型參數,但將typeof EventState
傳遞給類應該可以正常工作:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.