[英]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
}
}
這編譯沒有錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.