Typescript: streng-litteral typer fra interface-parametre
Lad os sige, at jeg har en grænseflade som denne
interface I{
id: string;
name: string;
age: number;
}
og en metode som denne
var obj:I={
id: 'abc',
name: 'Jim',
age: 23
};
changeProperty(name:string, value:any){
obj[name] = value;
}
Er der en måde at erklære name-parameteren type, så den matcher interfacefelter?
En løsning ville være noget i stil med dette
changeProperty(name: 'id' | 'name' | 'age' , value:any)
men i et meget større projekt, hvor en grænseflade kan have 20+ felter, er det meget sværere at vedligeholde dette.
Svar #1
Ja, som beskrevet i eksemplet for keyof og opslagstyper:
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'
