Typescript: tipuri literale de șiruri din parametrii interfeței


Să zicem că am o interfață ca aceasta

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

și o metodă ca aceasta

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

Există o modalitate de a declara parametrul name type pentru a se potrivi cu câmpurile interfeței?

O soluție ar fi ceva de genul acesta

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

dar într-un proiect mult mai mare, unde o interfață poate avea peste 20 de câmpuri, este mult mai greu de întreținut acest lucru.

Răspuns #1

Da, așa cum este descris în exemplul pentru keyof și tipurile de căutare:

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'