2017-07-09 6 views
1

anyを使用せずに、次の関数タイプをチェックすることはできません。私はこのエラーを取得しています制約ジェネリック型TとKここで、Kはkeyof Tを拡張し、T [K]はブール値ですか?

export function makeToggleState<T, K extends keyof T>(obj: {new(): T}, prop: K) { 
    return (state: T, show: boolean|null = null) => { 
    if (show === null) { 
     state[prop] = !state[prop] 
    } else { 
     state[prop] = show 
    } 
    } 
} 

class State { 
    value = true 
} 

makeToggleState(State, 'value') 

Type 'false' is not assignable to type 'T[K]'. 
    Type 'false' is not assignable to type 'T[string]'. 
(parameter) prop: K extends keyof T 

私はK extends keyof TT[K] is booleanをしたいコンパイラに指示するための最良の方法は何ですか?

+0

「T」(この場合は「状態」)のすべてのメンバーはブール値になるのですか? –

+0

@NitzanTomer私の場合ではありません。しかし、すべてのメンバーの解決策はブール値でも役に立ちます。 –

答えて

1

makeToggleState宣言の中でこの制約を持ってする方法はありませんが、あなたはその状態パラメータのためにTの交点とmapped typeT & {[n in K]: boolean}を使用して、それを返す関数のためにそれを宣言することができます。

export function makeToggleState<T, K extends keyof T>(obj: {new(): T}, prop: K) { 
    return (state: T & {[n in K]: boolean}, show: boolean|null = null) => { 
    if (show === null) { 
     state[prop] = !state[prop] 
    } else { 
     state[prop] = show 
    } 
    } 
} 

class State { 
    value = true; 
    name = 'q'; 
} 

const toggleValue = makeToggleState(State, 'value'); 

const s = new State(); 
toggleValue(s) 


const toggleName = makeToggleState(State, 'name'); // ok 

// but does not compile when you try to use it 
toggleName(s); 

//Argument of type 'State' is not assignable to parameter of type 'State & { name: boolean; }'. 
// Type 'State' is not assignable to type '{ name: boolean; }'. 
// Types of property 'name' are incompatible. 
//  Type 'string' is not assignable to type 'boolean'. 
関連する問題