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
