2017-05-22 19 views
0

みましょう私は、この活字体:

interface I{ 
    id: string; 
    name: string; 
    age: number; 
} 

ようなインターフェイスを持っており、この

var obj:I={ 
     id: 'abc', 
     name: 'Jim', 
     age: 23 
}; 
changeProperty(name:string, value:any){ 
    obj[name] = value; 
} 

のような方法が一致しnameパラメータtypeを宣言する方法はあります言うインタフェースパラメータから文字列リテラルのタイプインタフェースフィールド?

一つの解決策は、この

changeProperty(name: 'id' | 'name' | 'age' , value:any) 

ようなものになるだろうが、インターフェイスは20+のフィールドを持つことができる非常に大きなプロジェクトでは、これを維持するためにはるかに困難です。

+0

残念ながら、それはタイプが危険になりますように –

答えて

2

はい、keyof and lookup typesための例で説明したとおり

function changeProperty<N extends keyof I>(name: N, value: I[N]){ 
    obj[name] = value; 
} 

changeProperty('id', '123'); // ok 
changeProperty('age', 53); // ok 
changeProperty('name', 1); // Argument of type '1' is not assignable to parameter of type 'string'