'Why don't I get a type error when combining these apparently-incompatible objects with the spread operator?

Here's my minimal reproduction:

const br: Record<string, number> = {"b": 0};
const ar: {a: string} = {a: ""};
const brar: Record<string, string> = {...ar, ...br};
console.log(brar);

It seems to me like brar should not be allowed, since it claims to have only values of type string, but contains a number at key "b". Yet the typescript playground seems to accept it. What's going on?

Some changes that seem to cause a type error to arise:

  • using Record<"b", number> for br, or using no type signature at all,
  • using Record<string, string> for ar (though Record<"a", string> is fine).

edit: it turns out ar can be inlined, leading to an arguably even more minimal reproduction:

const br: Record<string, number> = {b: 0};
const abr: Record<string, string> = {a: "", ...br};
console.log(abr);


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source