Búsqueda de sitios web

typescript - Cómo solucionar 'type is not assignable to any' al acceder a un miembro


Tengo un código así:

interface IFoo {
  bar: string;
  baz: number;
}

function f(foo: IFoo, name: 'bar' | 'baz', val: any) {
  foo[name] = val;   // <<< error: Type 'any' is not assignable to type 'never'.
}

Si cambio el tipo de "baz" para que también sea "string", entonces el error desaparece:

interface IFoo {
  bar: string;
  baz: string;
}

function f(foo: IFoo, name: 'bar' | 'baz', val: any) {
  foo[name] = val;   // fine
}

¿Por qué está sucediendo esto, y sería posible arreglarlo? Estoy buscando una solución que sea mejor que reemplazar name: 'bar' | 'baz' con name: string.

Respuesta #1

Debes asegurarte de que el val tenga el tipo correcto que corresponde al name proporcionado.

Ejemplo de Playground de Typescript

interface IFoo {
  bar: string;
  baz: number;
}

function f<K extends keyof IFoo>(foo: IFoo, name: K, val: IFoo[K]) {
  foo[name] = val;
}

const foo: IFoo = {
    bar: '',
    baz: 0
}

f(foo, 'bar', 'abc')
f(foo, 'baz', 1)
console.log(foo);

o más general

function f<T, K extends keyof T>(foo: T, name: K, val: T[K]) {
  foo[name] = val;
}

Ejemplo de patio de juegos