ts-接口类型与类型别名

98 阅读3分钟

Interface 接口类型

定义内联的接口类型是不可复用的,所以我们应该更多地使用interface关键字来抽离可复用的接口类型

在 TypeScript 中,接口的语法和其他类型的语言并没有太大区别

可缺省属性

在前边的例子中,如果我们希望缺少 age 属性的对象字面量也能符合约定且不抛出类型错误,确切地说在接口类型中 age 属性可缺省,那么我们可以在属性名之后通过添加如下所示的? 语法来标注可缺省的属性或方法。

当属性被标注为可缺省后,它的类型就变成了显式指定的类型与 undefined 类型组成的联合类型

只读属性

我们可能还会碰到这样的场景,希望对对象的某个属性或方法锁定写操作,比如前面例子中,定义了 TypeScriptLanguage 变量之后,name 属性的值肯定是稳定不可变更的 'TypeScript' ,而不能再被变更为 'JavaScript' 或 'AnyScript' 。这时,我们可以在属性名前通过添加 readonly 修饰符的语法来标注 name 为只读属性。

数字作为对象索引时,它的类型既可以与数字兼容,也可以与字符串兼容,这与 JavaScript 的行为一致。因此,使用 0 或 '0' 索引对象时,这两者等价。

继承与实现

在面向接口编程时,我们怎么能少得了继承与实现?

在 TypeScript 中,接口类型可以继承和被继承,比如我们可以使用如下所示的 extends 关键字实现接口的继承。

既可以使用接口类型来约束类,反过来也可以使用类实现接口

Type 类型别名

接口类型的一个作用是将内联类型抽离出来,从而实现类型可复用。其实,我们也可以使用类型别名接收抽离出来的内联类型实现复用。

此时,我们可以通过如下所示“type别名名字 = 类型定义”的格式来定义类型别名。

此外,针对接口类型无法覆盖的场景,比如组合类型、交叉类型(详见 08 讲),我们只能使用类型别名来接收。

Interface 与 Type 的区别

通过以上介绍,我们已经知道适用接口类型标注的地方大都可以使用类型别名进行替代,这是否意味着在相应的场景中这两者等价呢?

实际上,在大多数的情况下使用接口类型和类型别名的效果等价,但是在某些特定的场景下这两者还是存在很大区别。比如,重复定义的接口类型,它的属性会叠加,这个特性使得我们可以极其方便地对全局变量、第三方库的类型做扩展 此文章为9月Day017学习笔记,内容来源于极客时间《重学前端》,强烈推荐该课程