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 keys
para
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.