《编程与类型系统》读书笔记(二)

282 阅读3分钟

以下是「第3章 组合」的读书笔记。

本章要点:将类型组合成复合类型、将类型组合成多选一类型、代数数据类型

复合类型

组合类型最明显的方式就是把它们放到一起来构成新的类型。

image.png

元组

元组类型由一组类型构成,通过它们在元组中的位置可以访问这些组成类型。元组提供了一种特殊的分组数据的方式,允许我们将不同类型的多个值作为一个值进行传递

type point = [number, number]

记录类型

记录类型与元组类似相似,可将其他类型组合在一起。但是,元组中按照分量值的位置来访问值,而在记录类型中,我们可以为分量设置名称,并通过名称来访问值。

在不同的语言中,记录类型被称为记录或者结构。

一般来说,最好定义带命名分量的记录,而不是传递元组。由于元组没有为分量命名,这就有可能错误地解释它们。

多选一类型

image.png

枚举

每当我们有一小组可能的取值,并且想要以不会导致歧义的方式表示它们时,就会使用枚举。

image.png parseDayOfWeek()函数返回DayOfWeek或undefined。userInput()函数调用该函数,并尝试提取出结果,要么是记录一个错误,要么是得到一个可以使用的DayOfWeek值。

在TS中,可以使用|类型操作符来实现这种行为,它允许我们将类型组合到一起

可选类型代表另一个类型T的可选值。可选类型的实例可以保持类型T的一个值(任意值),或者保存一个特殊值来指出不存在类型T的值。

最好不要让null自身成为某个类型的一个有效的值!

代数数据类型

“代数数据类型”(Algebraic Data Type,ADT)。ADT是在类型系统中组合类型的方式。

ADT提供了两种组合类型的方式:乘积类型与和类型。

乘积类型

乘积类型就是复合类型,元组和记录是乘积类型,因为它们的值是各构成类型的乘积。

类型A = {a1, a2}(类型A的可能值为a1和a2)和B = {b1, b2}(类型B的可能值为b1和b2)组合成为元素类型<A, B>时,结果为A×B = {(a1, b1), (a1, b2), (a2, b1), (a2, b2)}。

乘积类型将多个其他类型组合成为一个新类型,其中存储了每个构成类型的值。

元组逐渐进入了主流编程语言,元组与记录类型非常相似,只不过我们不能给它们的成员命名,并且通常可以通过指定组成元组的类型来以内联的方式定义元组。例如,在TypeScript中,[number, number]定义的元组类型由两个number值组成。

和类型

和类型就是多选一类型。它们组合类型的方式是允许有来自任何一个类型的值,但只能有一个值。类型A = {a1, a2}和B = {b1, b2}组合成为和类型A | B,结果为A + B = {a1, a2, b1, b2}。

和类型将多个其他类型组合成为一个新类型,它存储任何一个构成类型的值。

TypeScript提供了|类型操作符,但不使用这个操作符,也可以实现常见的和类型,如OptionalEitherVariant。这些类型为表示结果或错误,以及闭合类型集提供了强大的方式,并使我们能够用不同的方式来实现常见的访问者模式。