简介
本章介绍在《精进TS的62个实践方法》中提到的三条条款:
- 条款一:理解TS与JS的关系
- 条款二:知道你在使用哪个TS选项
- 条款三:理解代码的生成是独立于类型的
读书笔记
条款一:TS与JS的关系
- 所有JS程序都是TS程序,但所有TS程序不一定是JS程序
- TS的类型系统会对JS的运行时行为进行建模
- 【注意】TS添加了一个类型系统,该类型系统咳对JS的裕兴时行为进行建模,并尝试发现将在运行时引发的异常代码。但不要期望它会标记所有异常!通过类型检查器的代码仍可能在运行时抛出异常。
- 存在部分JS运行,TS禁止的代码行为,这个部分很多程度上取决于代码风格
const a = [] + 7 ;// js中运行正常,a的值为7
// 在TS中报错【运算符‘+’ 不能被应用在类型上(TS2365)】
条款二:知道你在使用哪个TS选项
- noImplicitAny: 控制着变量是否必须知道它们的类型,具体表现之一是当形参没有定义类型时,默认类型为any,这种情况会被报错
function (a,b){}
// 参数“a”具有隐式类型any
- strictNullChecks: 控制null和undefined在每种类型中是否被允许
const a:number = null // 未开启strictNullChecks的时候,该行代码被认为是有效的
const x:number = null // 开启strictNullChecks的时候,该行代码会被报错
// null 类型不能被分配给类型'number'
const t:number|null = null // 正确
- TS编译器包含了一些能够影响语言核心方面的设置
- 使用strict这类的选项能够获得TS提供的最彻底的检查
条款三:理解代码的生成是独立于类型的
- 【重点】代码的生成是独立于类型系统的。这意味着TS类型不能影响代码运行时行为或性能
- 类型错误的代码仍会产生输出
应当以零错误作为目标。当然存在错误时,代码也能正常输出
- 无法在运行时检查TS类型
TS类型都是”可擦除“的:编译成JS的过程,其中一部分就是简单地从代码中删除所有的interface、type和类型注释。 (书中给出了一个类型定义的例子,值得细看)
- 类型操作不能影响运行时的值
例如在代码中进行强制类型转换‘as xxx’,但它无法影响代码的运行行为
- 运行时类型可能与声明类型不一样,应当尽量避免这种情况
- 你不能基于TS类型来重载一个函数,多个生命只会有一个实现
- 【注意】TS类型对运行时的性能没有影响
虽然没有运行时开销,但是TS编译器会引入构建时的开销。
参考
- 《Effective Typescript 精进Typescript代码的62个实践方法》