簡體   English   中英

Typescript Generics keyof參數簽名

[英]Typescript Generics keyof parameter signature

我很難過,希望這個簡化的例子能很好地解釋它:

我有一個 class 實例保存數據,還有另一個復合 class 實例來呈現數據。 數據 class 為 UI class 提供回調,以獲取和設置數據屬性。 我也被“set”難住了,但我現在會堅持使用“getVal”。

class Person {
  private _data: DataObj

  constructor() {
    this._ui = new PersonUI({
      getVal: (key) => this.getVal(key)
    })
  }

  getVal<T extends keyof DataObj>( key: T ) {
    return this._data[key]
  }
}

class PersonUI {
  constructor(arg: UIArg) {}
}

Typescript 可以推斷 _data 值的類型,但我不知道如何為 UIArg 編寫一個接口來保持推斷的類型,我能想到的只是“任何”例如:

interface UIArg {
  getVal: <T extends keyof DataObj>(key: T) => any
}

有沒有辦法編寫接口來保持推斷的類型?

獎勵問:有沒有辦法編寫 Person.p.setVal 方法來使用推斷類型? 前任:

setVal<T extends keyof DataObj>(key: T, val: any) {
  this._data[key] = val
}

您正在尋找索引訪問類型 如果您有一個類型T和一個鍵類型K extends keyof T ,那么該鍵的屬性將具有類型T[K]的值。 在您的情況下, DataObj扮演T的角色,我將使用K來表示鍵類型(比T更慣用)......所以有問題的值類型是DataObj[K]

interface UIArg {
    getVal: <K extends keyof DataObj>(key: K) => DataObj[K],
    setVal: <K extends keyof DataObj>(key: K, val: DataObj[K]) => void;
}

class Person {
    private _data: DataObj
    private _ui: PersonUI;
    constructor(data: DataObj) {
        this._data = data;
        this._ui = new PersonUI({
            getVal: key => this.getVal(key),
            setVal: (key, val) => this.setVal(key, val)
        })
    }

    getVal<K extends keyof DataObj>(key: K): DataObj[K] {
        return this._data[key]
    }

    setVal<K extends keyof DataObj>(key: K, val: DataObj[K]) {
        this._data[key] = val
    }

}

這編譯沒有錯誤。

Playground 代碼鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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