欢迎光临散文网 会员登陆 & 注册

TypeScript 类型基础——类型衍生

2023-07-20 16:10 作者:没用软件开发日记  | 我要投稿

    TS的类型系统引入了和强类型语言一样的继承模式,不过在interface和type上体现的并不一样。

    首先我们定义了接口A,我们基于已有的接口A“拓展”出接口B,B获得了A所有的字段,也就是说B是A的子类型。这里我们在声明接口时使用了extends关键字标明B拓展于A。

    这里我们定义了类型A,我们基于已有的类型A与类型 { gender : string }合并创建出类型B,B同样获得了A的所有字段,B类型是包含了A类型所有字段的新类型,我们使用“&”符号来计算类型A合并类型{ gender : string }的结果。

    这些有什么用?

    基于基础设施的衍生通常能让我们在高层获得一致的基础建设。比如服务端的返回值经常出现code、data、msg等字段,我们在声明每一个返回值类型接口的时候就可以以上述字段作为基础设施,每一个服务端返回值都拓展于这个基础设施,在大量重复的工作中屏蔽相同点往往能让我们专注于不同的地方。与此同时更少的重复让我们失去了失误的可能,排除了错字等低级错误带给我们的bug。

    对于强类型语言来说,类型的继承往往意味着可以提供多态的能力,继承于非虚基类的子类型对象可以稳定的传给参数类型为基类类型的函数,TS中也是如此:

    也就是说可以利用这种机制,借助函数去“收窄”参数或者返回值的类型。一个对“基础设施”(基类数据)进行操作的函数不需要关心其参数是否来自于子类,只需要将参数类型标记为基类类型就可以了;函数的返回值的消费者不关心子类细节,则我们就可以将返回值标记为基类类型,却返回子类型的数据,屏蔽的越多开发过程中消耗的心智就越少。

    在设计模式的角度上去讲,多态体现出的是不同的接口负责不同的职责,以上面的代码为例,getName的职责属于接口A的业务领域,那么A所属的业务领域就只能对实现接口A的类型进行操作。如果现在有另一个函数getGender:

    getGender属于接口B所在的领域,那么就只能以B为参数,接口的隔离不仅仅是数据的隔离,也是领域的隔离。通常我们将某一种领域的通用语言以接口描述,遵循接口规则则可以参与领域业务。

    上面的知识请参考接口隔离原则ISP。


下一篇记录一下类Class。

TypeScript 类型基础——类型衍生的评论 (共 条)

分享到微博请遵守国家法律