Pesquisa de site

typescript - Por que `type a={} extends {a?:number}? true:false;` é verdadeiro


Por que type a={} extends {a?:number}? true:false; é true, mas type b={a?:number} extends {}? true:false; também é true!
Eu acho que {} é um supertipo e não pode estender nenhum tipo, mas se aqui houver um tipo em que todas as propriedades são opcionais (?), {} vai estender esse tipo, por quê?
O problema principal é como julgar a compatibilidade entre tipos. Antes de encontrar esse problema, eu sempre usava a teoria dos conjuntos para explicá-los, mas essa abordagem é ineficaz para esse problema, então eu preciso de uma nova teoria, a menos que o TypeScript faça algo especial com {}

Resposta #1

Você poderia interpretar extends como 'pode ser atribuído a'. Portanto, {} estende qualquer tipo em que todas as propriedades são opcionais.

const a: { a?: string, b?: number } = {}; // legal, no error