条款2: noImplicitAny: 不允许定义为any类型, strictNullCheck:不允许给具体类型变量赋值null 、 undefined
条款3: link50:函数的重载
条款4:ts的类型是open的
link54:遍历对象很难做到类型的正确
条款5:限制使用any
条款6:利用编辑器查看类型定义,ts推断类型
条款7:类型的集合
- 子集。有两个类型Person, Student。如下,我们称Student是Person的子类型
interface Person {
age: number
}
interface Student {
grade: number
}
Student类型的值可以应用到使用Person类型的表达中。初始化变量除外
const mary: Person = {
age: 10,
grade: 6, // 报错,触发了额外类型检查(见条款11)
}
const peter = {
age: 9,
grade: 5
}
function getAge(p: Person) {}
// 不报错
getAge(perter)
- 联合类型
type t = Person & Student // Student
type s = Person | Student // Person
- extends继承
条款8:
条款9: 优先选择类型声明而不是断言
条款10:避免使用对象包装类(eg:String、Boolean)
包含了隐式转换,String类型不能赋值给string
条款11:额外属性检查和局限性
一般来说,子类型的变量是可以应用到父类型中的。如条款7的例子。但是直接初始化变量为一个对象字面量时会启动额外属性检查。不允许赋值一个子类型到父类型中。
// not work
const peter: Person = {
age: 10,
grade: 9 // Person上不存在grade属性
}
// work:但是可以通过一个中间变量跳过这个检查。
const p = {
age: 10,
grade: 9
}
const mary: Person = p
// work 使用as断言也能绕过这个检查
发生在只有可选属性的“弱”类型的检查
确保值类型和声明类型至少有一个共同属性。使用中间变量赋值也不能绕过
interface ClassRoom {
teacher?: Person,
student?: Student
}
const temp = {
location: 'no.1/3'
}
// not work: 没有共同属性
const cr: ClassRoom = temp
条款12:习惯使用函数类型
好处是:1. 方便复用该类型 2. 类型和函数实现分开 3. 少了一些类型标注
type Fn = (params: number) => number
const fn: Fn = (a) => a--
// instead of
const fn = (a: number) => a--
条款13:type和interface的区别
大部分情况下, type和interface功能上都能实现。
type能联合类型,定义条件类型,映射类型,更容易的表达数组,元组。
interface能做到声明合并,方便拓展类型
// a.ts
export interface A {
name: string
}
// b.ts
import A from './a.ts'
interface A {
age: number
}
// A: name, age
条款14:使用类型操作和泛型
- keyof、typeof、类型索引
[key: string]: string、映射类型[k in 'name' | 'age']: State[K] - 使用泛型,减少泛型类型的重复,使用extends约束泛型
- 标准库的泛型: Pick, Partial, ReturnType
条款15:动态数据使用索引签名(做好undefined的兼容
interface Id {
[key: string]: number // 只能定义一种类型
}
const id: Id = {} // 给空对象也是合法的
条款16:优先选择Array、Tuple、ArrayLike而不是数字索引签名
条款17:readonly & Readonly泛型
- 当变量不希望被修改时,使用readonly声明。
- readonly声明的数组push等方法也不能修改,const声明的数组push等方法依然能修改
- readonly声明只是浅层的
条款18:使用映射类型保持相关值和类型的同步
// 当CompProps增删改属性,shouldUpdateProp也能收到ts警告
const shouldUpdateProp: Reacord<keyof CompProps, boolean> = {
name: true,
// ...
}