接口 vs 类型别名

前端精髓

共 1004字,需浏览 3分钟

 ·

2021-03-29 21:41


类型别名会给一个类型起个新名字。类型别名有时和接口很像,但是可以作用于原始值,联合类型,元组以及其它任何你需要手写的类型。


type Name = string;type NameResolver = () => string;type NameOrResolver = Name | NameResolver;function getName(n: NameOrResolver): Name {    if (typeof n === 'string') {        return n;    }    else {        return n();    }}


起别名不会新建一个类型,只是创建了一个新名字来引用那个类型。给原始类型起别名通常没什么用,只是一种使用形式。


同接口一样,类型别名也可以是泛型,我们可以添加类型参数并且在别名声明的右侧传入:

type Container<T> = { value: T };


我们也可以使用类型别名来在属性里引用自己:

type Tree<T> = {    value: T;    left: Tree<T>;    right: Tree<T>;}


然而,类型别名不能出现在声明右侧的任何地方。

type Yikes = Array<Yikes>; // error


像我们提到的,类型别名可以像接口一样;然而,仍有一些细微差别。


另一个重要区别是类型别名不能被 extends 和 implements(自己也不能 extends 和 implements 其它类型)。因为 软件中的对象应该对于扩展是开放的,但是对于修改是封闭的,你应该尽量去使用接口代替类型别名。


字符串字面量类型允许你指定字符串必须的固定值。在实际应用中,字符串字面量类型可以与联合类型,类型保护和类型别名很好的配合。通过结合使用这些特性,你可以实现类似枚举类型的字符串。


type Easing = "ease-in" | "ease-out" | "ease-in-out"


浏览 12
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报