Tipagem estrutural (duck typing) x nominal
Pergunta
TypeScript usa tipagem estrutural. O que isso quer dizer na prática, e quando ela te morde?
Resposta esperada
Tipagem estrutural: um valor é compatível com um tipo se tiver a forma (as propriedades) esperada, independente de ter sido declarado como aquele tipo. `function f(p: { x: number })` aceita qualquer objeto com um `x: number`, mesmo de uma classe/interface diferente. Vantagem: menos boilerplate, ótima interoperabilidade, fácil de mockar em teste. Onde morde: dois tipos com a mesma forma mas significados diferentes são intercambiáveis sem querer — um `UserId` e um `OrderId` que são ambos `string` se misturam, ou `Metros` e `Pes` que são ambos `number`. A solução idiomática é 'branded types' (`type UserId = string & { readonly __brand: 'UserId' }`) pra forçar distinção nominal onde ela importa. Também morde com excesso de propriedades em objetos literais (o TS tem uma checagem extra só pra literais).
Por que perguntam isso
Pergunta pleno/sênior de TS. Termo-chave: 'branded types' / 'nominal typing'. Bônus: a checagem de excess property em literais.