簡體   English   中英

Typescript枚舉泛型映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM