TypeScript 类型编程 - 类型编程入门(2021/7/8更新)

本文介绍了TypeScript的类型编程,包括类型和类型系统的作用,强类型代码的优点,以及类型系统的类型分类。强调了类型在确保程序正确性、不变性、封装性、可组合性和可读性上的贡献,并对比了动态类型和静态类型的区别。
摘要由CSDN通过智能技术生成

类型编程入门

1. 类型和类型系统

类型:

数据的类型是指这个数据所有可能的取值的集合。类型有两方面的作用:

一是解释数据的含义。在计算机底层,数据是用位表示的,例如,16位序列1100001010100011。不同的计算机可以对这一串序列做出完全不同的解释,它既能表示16位整数49827、符号整数-15709,也可以表示 UTF-8 编码的英镑符号£,甚至可以表示两个连续的8位整数,或其他任何东西。给数据指定一个类型,就可以告诉计算机应该怎样解释这一串数据。

二是限制数据的范围。例如,16位符号整数能够表示任何位于区间 [-32768, 32767] 之间的整数数据。任何其他的取值都是无效的。再比如,常数类型的取值不允许修改。这可以避免许多潜在的错误,例如,用户输入超出取值范围、程序对不该修改的数据进行修改等。

类型系统:

类型系统是一组规则,例如,常数类型的值不允许修改就是一条规则。多个不同类型所遵守的规则一起组成了一个类型系统。

类型系统通过两种方式确定程序中的变量、函数等元素需要遵守哪些类型规则:一是通过代码中的关键字确定元素的类型;二是通过上下文推断元素的类型。

类型检查:

确定元素的类型之后,类型系统中的规则,需要通过类型检查来实施。例如,常数数据和相同取值的可变数据在内存中没有区别,类型检查器则确保我们无法修改常数数据的取值。

2. 强类型代码的优点

编写强类型的代码主要给程序带来了五个方面的优点:正确性、不变性、封装性、可组合性、可读性。

正确性:

正确性意味着程序能够按期望运行,并产生我们期望的结果,而不会发生 运行时错误 或者 崩溃

类型通过将难以察觉的运行时问题,转化为必须修复的编译错误,来提高程序的正确性。

例如,下面的程序中,我们希望函数 add 能够返回两个数 a 和 b 的和。但是,当我们无意中把字符串当作数值传递给函数时,程序仍然正常运行,返回值却并非我们期望的结果。这意味着这个程序是不正确的:

function add(a, b) {
   
    return a + b;
}
console.log(add(1, '2'));			// 返回12,不是期望的结果

而如果我们指定 a、b 以及函数的返回值类型都为数值类型,这一错误就会在编译时被捕捉到,程序将无法编译。也就是说,编译器拒绝了错误的程序,程序无法运行。我们必须在正确修改之后,才能够编译并运行这个程序:

function add(a: number, b: number): number {
   
    return a + b;
}
console.log(add(1, '2'));			// 出现编译错误

在数学上,我们可以把程序运行的状态空间定义为程序中出现的所有类型的笛卡尔积。程序的运行过程就是这个状态空间中不同状态之间的变换。而类型就是通过缩小这个状态空间,来避免程序运行时出现错误的状态。(注:前面我们定义了类型是数据所有可能取值的集合;而两个集合的笛卡尔积就是这两个集合的有序对。)

不变性:

前面提到,程序的运行可以理解为状态空间中的变换。所谓不变性就是指,程序处于好的状态并维持这个状态不变的性质。

数据竞争就是典型的由程序不变性弱造成的问题。例如,下面这段程序中,定义了一个除法函数,用来返回 x 除以 y 的结果。之后用 setTimeout 在5秒钟之后调用这个函数。参数 b 一开始并不是 0 ,但是在函数被调用之前,b 却被修改成了0,导致程序出错。

let a: number = 20;
let b: number = 10;

function divide(x: number, y: number): number {
   
    if (y == 0) throw new Error("除数不能为0");
    return x / y;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值