Digamos que tenhamos código TypeScript que se parece com:
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];
}
Isso dá erro
Type 'string | number' is not assignable to type 'never'.
para a declaração
user1[key] = user2[key];
Se mudarmos a definição de keyspara
let keys: string[] = ["id", "name"];
o erro desaparece, mas perdemos a segurança do tipo.
Existe alguma maneira de evitar esse erro enquanto ainda mantemos a segurança do tipo?
let keys: string[]introduz outro problema, mas isso seria um erro em tempo de execução (se a matriz contiver um nome de campo inexistente como valor). O que estamos procurando é uma verificação em tempo de compilação para evitá-la.
let keys: string[]remove o erro, mas introduz outro, já que TS não pode garantir issouser1[key]ouuser2[key]é válido.