2017-04-14 45 views
1

我試圖使用keyof強制在現有的JS庫中的類型安全(所以我不能重新定義任何函數調用)。類封裝了一個數據結構,getset功能,像這樣:Typescript keyof - 如何在聲明中使用該值?

到目前爲止好!但是現在我想添加一個觀察者,使用我在get中使用的相同的keyof功能。它的第二個參數是一個回調函數,它提供了新的和舊的密鑰值。我試着像這樣創造的:

type Callback<T, K extends keyof T> = (newValue: T[K], oldValue: T[K]) => void; 

declare class Component<T> { 
    observe(key: keyof T, cb: Callback<T, key>) 
} 

但打字稿被拒絕我在observe功能使用key,說

找不到名字的「鑰匙」

有任何方式,我現在繞過這個限制嗎?我可以這樣做:

observe<K extends keyof T>(key: keyof T, cb: Callback<T,K>) 

,它工作正常,但是這意味着我的實際代碼是:

thing.observe<"key">("key", (newValue, oldValue) => {}) 

這只是看起來怪怪的。

回答

1

嘗試使用此:

type Callback<T, K extends keyof T> = (newValue: T[K], oldValue: T[K]) => void; 

declare class Component<T> { 
    observe<K extends keyof T>(key: K, cb: Callback<T, K>); 
} 

// example class 
class XClass extends Component<{ name: string; value: number; }> { 
    testFn(): void { 
     // here the first argument needs to be a name of a T property 
     // newValue and oldValue will be the same type of this property 
     this.observe("name", (newValue, oldValue) => { }); 
    } 
} 
+0

它的工作!太棒了,謝謝。 – Alastair

+0

好!很高興幫助你:) – Diullei

相關問題