类型别名和接口的区别

类型别名和接口非常相似,在很多情况下您可以在它们之间自由选择。 interface 的几乎所有功能都在 type 中可用,主要区别在于无法重新打开类型以添加​​新属性,而接口始终可扩展。

Type aliases and interfaces are very similar, and in many cases you can choose between them freely. Almost all features of an interface are available in type, the key distinction is that a type cannot be re-opened to add new properties vs an interface which is always extendable.

`Interface`

nfSKSmHnwi6/kvfAd4BtUHvYDgss/Tx255jpSLTJo48=

`Type`

nHXbiCNm/g4l0UM9B0FuyJNbgg0ZCdA0yf0itjsfV1g=

lPBbU/KgKOI2n0rMPUpvjbV7ssCWNZhV3FcpMRRGUKZ04VnbRyqvPYfiPCg0r65CF0rgpBAO0KgdwgwoSpeSIg==

interface Animal {
  name: string
}

interface Bear extends Animal {
  honey: boolean
}

const bear = getBear() 
bear.name
bear.honey

2kUDLsOVI2k6rl7Xd7ry5Zi3/khxWKRKZw0i44tBjn7VX3IbBxgEJGfNOa1sdINz/ZIVlNk6C6KHb9gLLiI1+EHSSMO088SX0oiRXXjudLY4mZ9WQCEHoYJAvs+fT7jK

type Animal = {
  name: string
}

type Bear = Animal & { 
  honey: boolean 
}

const bear = getBear();
bear.name;
bear.honey;

iFx9lKJgozY6kG+UYBHo7fc/ku53iW8NuWTLEpAVGrn8J2V62nxPmGD2lJgtNHMP87HtvyPccwJ0ZMT6VHn5uSUD4Jw1zkWJhmr5jiIvPwD48xwVkacgMQMJ5zQd8OGQ

interface Window {
  title: string
}

interface Window {
  ts: TypeScriptAPI
}

const src = 'const a = "Hello World"';
window.ts.transpileModule(src, {});

XytAyBp4Z+ShhrdDHMswA+wppPKgKSilp8Rbao7Dh5umCPb+OOxxjOOnJl5ecPIhT6/U+PJBOQIWsELk8XRO0uttUIa2AzkHuOJBmyawv/X+vvozAnbAqbRPbSaleSbz

type Window = {
  title: string
}

type Window = {
  ts: TypeScriptAPI
}

 // Error: Duplicate identifier 'Window'.

5jTRVogKgqdP/3uPknmMV70CQtV4pCheRDEiBt3oMjvGnLxY5XA9NBOviXBr5pHqWeDeWFUPZx8f1EeW9unIRc56EX7itBmkohH9r1N9bWb6BJpR3pn42wNtPwveTmIvL0yLDhIzSf1kMknIMHH16plCYX9Uw+UyivSRcSyE6Jm+wNmSJb8tjyarkfEtK2dKMyfYxjfaY9WaT2GY1Lqe+eWP7jwGgsHtn+VnG0HHYbMPeSbbT1Fz5febgF8zo9gBZ0eoKwq6DElbt2zckvY4H/4e0JGSsyiuABY97seMWDQiFBLpYUlDPTwYFbPrTcgBU0KYYVHvcn2gOiLQa0VbrnkObrPreZCFbAXk8kxE/MGDecUzQLIaPkoMCAp4kWyY

  • 在 TypeScript 4.2 版之前,类型别名 可能出现在错误消息中,有时代替等效的匿名类型(可能需要也可能不需要)。接口将始终在错误消息中命名。

    AdYSvRvELV2MiNLSjGlDawzW/2E7y7cP2XJFZ+0OmH4ckZhA2nog0QYY46l2Ajozl488mkG9EWQTIEVqVuAxf8YBtlLzU48e5h5/s0olLb+LW/K/kduMqKr3FPDRz7LqinwbuFb5FvTdmNeQOmJRL3EEzKaH2wg2XV9kUoPiPEsnyJzMF7TWSOkRzrJ1xYVzeljLXC8I5TcWSzCxxciex3+1sba97R69si6RgNztmR1UcCagnDEQhJx1JftxoUyyhZ5Anu12NZuCi0NsqVqrKdOK08eRCXyUDEtdrZSfBdxvASImONhYfB4dUHhRS8HhmDDu8UjW4qAXUUN2LRvlMemKG6DV0lnHNUXih/U3Vi4n7s+lVMhCMktlTw9K8z3E

  • 类型别名不得参与 在声明合并中,但接口可以

    sHS6px88cXtsJ5DGR3pz1m1XVor9Me1LqVRfy28BSwOuCEs8varjTXyovpOWLnQYndCUIIrbORlBdGI4en9AroHYl+ZR0G8esDl78oaZQkpMgXJHJYVyolZYJFTGVMAvYj4tyuCHyVLw745QWaqvhT3SGDrQMTumHtLN6rZEPwk=

  • 接口只能用于 声明对象的形状,而不是重命名基元

    ZgCXvR8OJxcSkvLRXf4P+upVElP52SM4i77UcwiYerHU0J9+kT6RpkPCbAn3BUaWW7pW+LiU5qS2fkY/9HmqbRPn7XFV4z3FwXVC4a03udqbc8bNGGR2RK+XMOisop85uB0GOMHE3059gcMDPo0AE6y7/fbllvNdejXCEy4iHahGMGONH9ZKRPMLBLlY6g/b

  • 接口名称将在错误消息中显示为 总是以其原始形式出现,但仅当它们被名称使用时。

    oL1qMxsIRyCepvqq2rLXrVAwg9NDlB2AiM4GtnuiHZ4Cu5yRuX3M2/jIarhk+Xheg/zbdzWvbRJ68NQHKhC7z2tskkV4PLPApEDlLe/mHeYyWBsXhPLAf/O8Cs98oXwppyBXDEJdE7Z4Vh/BrrLKNZUiGmY2XD/71GxqDvrfZXmLpUK7Y8hK/+zKgvSOnAXdUDqBYE3SIJWMCBJWizbHczRptjbAaciJLlKORR6K3KRvStVWFqXHSekThtl2Wl0R

KI0oHiiDzXujC15/XLDW8tFVatx7Nu1Xx00Bi6aa3dP7I9JaJM8FdlWscKIGAUBZ3/YYCttnR6gm060eXeHNTiiCviTljePHCktd3LUDqOuXRy35H+TlYg74Z1UmEuxDsB6UxHe0yvsK7sUeiROqxB9kLhM19abFN+GPFO7EzwgXQBLtiOvhfhu6E+6TG7sdDfwWR3ul4+oiTtQPyYsdDn8oIeyyXBGHCCoxr0XH7LtSIFEfcU2ldF8WYr8mQ51rX4xo1N//ernBpUw+q2cihYbnmJw6WNlnRqtXTGHCjJVXnrQFPSTPKUMkXisfxO0f5ZPiRR+X7KG/tMO0h9/g+6wvjDuMXX32tQw1jpP0gNXZzqqH48gLhQWmGpwpKxH1Orh1//feKExRrx5/vf4oGksJjnLhh6MJFJ2uqugYNqpKVZT1warBQaH6fp9KS/9bDEAIIrf3+7WvGpHkMZhHCk0b/vNv70XRMGBkAqmOdLUgsxf6b+zGJAHEM0GIfRp0t5YcJTV6BsY0qKasB9Dts46xtl1MgAe6pTSnRaMWO3I7qU8y7guHaqW+V3mpaeaKOCEJcB/F/UBGoniIn2eBpUS39S+Aw6QTzZnEcVLDn/JvTVSmPRjbZqE7O4EWuAdiMX274Z801cgQtIoRsrF8xM3Wuc+2ZA7EtNmxXgZ+pKItjvoiLU3KABTgb+b0H9llcZ9rm19Jp6sQXpOX/OcmZw==