接口的声明
在前面我们通过type可以用来声明一个对象类型:
对象的另外一种声明方式就是通过接口来声明:
他们在使用上的区别,我们后续再来说明。
接下来我们继续学习一下接口的其他特性。
可选属性
接口中我们也可以定义可选属性:
只读属性
接口中也可以定义只读属性:
这样就意味着我们再初始化之后,这个值是不可以被修改的;
索引类型
前面我们使用interface来定义对象类型,这个时候其中的属性名、类型、方法都是确定的,但是有时候我们会遇 到类似下面的对象:
函数类型
前面我们都是通过interface来定义对象中普通的属性和方法的,实际上它也可以用来定义函数类型:
当然,除非特别的情况,还是推荐大家使用类型别名来定义函数:
交叉类型
前面我们学习了联合类型:
联合类型表示多个类型中一个即可
还有另外一种类型合并,就是交叉类型(Intersection Types):
交叉类似表示需要满足多个类型的条件;
交叉类型使用 & 符号;
我们来看下面的交叉类型:
表达的含义是number和string要同时满足;
但是有同时满足是一个number又是一个string的值吗?其实是没有的,所以MyType其实是一个never类型;
交叉类型的应用
在开发中,我们进行交叉时,通常是对对象类型进行交叉的:
interface和type区别
我们会发现interface和type都可以用来定义对象类型,那么在开发中定义对象类型时,到底选择哪一个呢?
如果是定义非对象类型,通常推荐使用type,比如Direction、Alignment、一些Function;
如果是定义对象类型,那么他们是有区别的:
interface 可以重复的对某个接口来定义属性和方法;
而type定义的是别名,别名是不能重复的;
字面量赋值
我们来看下面的代码:
这是因为TypeScript在字面量直接赋值的过程中,为了进行类型推导会进行严格的类型限制。
但是之后如果我们是将一个 变量标识符 赋值给其他的变量时,会进行freshness擦除操作。