Digamos que tenemos un código TypeScript que se ve así:
type User = {
id: number,
name: string,
}
let user1: User = {id: 123, name: "Hello"};
let user2: User = {id: 456, name: "World"};
let keys: (keyof User)[] = ["id", "name"];
for (let key of keys) {
user1[key] = user2[key];
}
Esto da error
Type 'string | number' is not assignable to type 'never'.
para la declaración
user1[key] = user2[key];
Si cambiamos la definición de keys
a
let keys: string[] = ["id", "name"];
el error desaparece, pero perdemos la seguridad del tipo.
¿Hay alguna forma de evitar este error sin dejar de mantener la seguridad de tipo?
typescript
keyof
Vaibhav K
fuente
fuente
let keys: string[]
elimina el error pero introduce otro, ya que TS no puede garantizarlouser1[key]
ouser2[key]
es válido.let keys: string[]
presenta otro problema, pero sería un error en tiempo de ejecución (si la matriz contiene un nombre de campo no existente como valor). Lo que estamos buscando es una verificación en tiempo de compilación para evitarlo.Respuestas:
No hay una buena manera de evitar una aserción de tipo aquí. En una versión reciente en TS (creo que la publicación 3.5) al escribir a través de un índice, el valor escrito debe ser compatible con todos los valores de propiedad posibles especificados por la clave. En su caso, eso sería lo
number & string
que reduce anever
por lo tanto el error.La causa raíz es que TS no realiza un seguimiento de las variables solo de los tipos, por lo que, en lo que respecta a los tipos, su ejemplo no sería diferente de:
La solución más simple es usar una aserción de tipo si, como en su caso, está seguro de que esto está bien:
Jugar
Alternativamente (pero ya no es seguro), puede usar una pequeña escapatoria donde
T[K]
se puede asignar un valor de índice:Jugar
fuente
as never
funciona. Además, ¿podría explicar elset
método en el segundo ejemplo?