typescript - Tilldela en egenskap i ett objekt med egenskaper av olika typ


Denna kod var giltig i 3.3.3, men misslyckas med att kompilera i 3.5.1 och nyare. Hur kan jag fixa det? Playground.

interface IData {
  a: string;
  b: number;
}

var form: IData = { a: "", b: 0 };

function doSmth(field: keyof IData, value: any) {
  form[field] = value; // Type 'any' is not assignable to type 'never'.
}

Okej, verkar som att jag har förstått anledningen: den tidigare typen av form[field] var string | number, men nu är det string & number vilket är never. Men jag måste fortfarande få det att fungera...

Svar #1

Verkar löst genom att använda en generisk parameter:

interface IData {
  a: string;
  b: number;
}

var form: IData = { a: "", b: 0 };

function doSmth<F extends keyof IData = keyof IData>(field: F, value: IData[F]) {
  form[field] = value;
}

doSmth("a", "abc")
doSmth("b", 13)