2017-04-14 5 views
1

keyof을 사용하여 기존 JS 라이브러리에서 유형 안전을 강화하려고 했으므로 (어떤 함수 호출도 재정의 할 수 없음). 이 클래스는과 같이, getset 기능과 데이터 구조를, 랩 :Typescript keyof - 선언에서 값을 사용하는 방법?

declare class Component<T> { 

    set(data: T); 
    get(key: keyof T); 

} 

를 지금까지 너무 좋아! 하지만 지금은 옵서버를 추가하고 싶습니다. 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