typescript中interface和type的区别
<p>https://github.com/SunshowerC/blog/issues/7</p><p><br>大家使用 typescript 总会使用到 interface 和 type,官方规范 稍微说了下两者的区别<br>An interface can be named in an extends or implements clause, but a type alias for an object type literal cannot.<br>An interface can have multiple merged declarations, but a type alias for an object type literal cannot.<br>但是没有太具体的例子。<br><br>明人不说暗话,直接上区别。<br><br><span style="font-size: 18px"><strong>相同点</strong></span><br><br>都可以描述一个对象或者函数<br><br><strong>interface</strong><br><br>interface User {<br> name: string<br> age: number<br>}<br><br>interface SetUser {<br> (name: string, age: number): void;<br>}<br><br><strong>type</strong><br><br>type User = {<br> name: string<br> age: number<br>};<br><br>type SetUser = (name: string, age: number): void;<br><br><strong>拓展(extends)与 交叉类型(Intersection Types)</strong><br><br>interface 可以 extends, 但 type 是不允许 extends 和 implement 的,但是 type 缺可以通过交叉类型 实现 interface 的 extend 行为,并且两者并不是相互独立的,也就是说 interface 可以 extends type, type 也可以 与 interface 类型 交叉 。<br>虽然效果差不多,但是两者语法不同。<br><br><strong>interface extends interface</strong><br><br>interface Name { <br> name: string; <br>}<br>interface User extends Name { <br> age: number; <br>}<br><br><strong>type 与 type 交叉</strong><br><br>type Name = { <br> name: string; <br>}<br>type User = Name & { age: number };<br><br><strong>interface extends type</strong><br><br>type Name = { <br> name: string; <br>}<br>interface User extends Name { <br> age: number; <br>}<br><br><strong>type 与 interface 交叉</strong><br><br>interface Name { <br> name: string; <br>}<br>type User = Name & { <br> age: number; <br>}</p>
<p> </p>
<p><span style="font-size: 18px"><strong>不同点</strong></span><br><br><span style="font-size: 16px"><strong>type 可以而 interface 不行</strong></span><br><br><strong>type 可以声明基本类型别名,联合类型,元组等类型</strong><br><br>// 基本类型别名<br>type Name = string<br><br>// 联合类型<br>interface Dog {<br> wong();<br>}<br>interface Cat {<br> miao();<br>}<br><br>type Pet = Dog | Cat<br><br>// 具体定义数组每个位置的类型<br>type PetList = <br><br><strong>type 语句中还可以使用 typeof 获取实例的 类型进行赋值</strong><br><br>// 当你想获取一个变量的类型时,使用 typeof<br>let div = document.createElement('div');<br>type B = typeof div<br><br><strong>其他骚操作</strong><br><br>type StringOrNumber = string | number; <br>type Text = string | { text: string }; <br>type NameLookup = Dictionary<string, Person>; <br>type Callback<T> = (data: T) => void; <br>type Pair<T> = ; <br>type Coordinates = Pair<number>; <br>type Tree<T> = T | { left: Tree<T>, right: Tree<T> };<br><br><strong><span style="font-size: 16px">interface 可以而 type 不行</span></strong><br><br><strong>interface 能够声明合并</strong><br><br>interface User {<br> name: string<br> age: number<br>}<br><br>interface User {<br> sex: string<br>}<br><br>/*<br>User 接口为 {<br> name: string<br> age: number<br> sex: string <br>}<br>*/<br><br><span style="font-size: 18px"><strong>总结</strong></span><br>一般来说,如果不清楚什么时候用interface/type,能用 interface 实现,就用 interface , 如果不能就用 type 。其他更多详情参看 官方规范文档</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/liuzhenwei/p/12530928.html
頁:
[1]