重学 typescript 之类型收窄下

96 阅读1分钟

赋值

typescript 右边的赋值可以收窄左边的类型,再次赋值的类型需要在首次声明类型的范围之内。

image.png

typescript 根据 x 的声明语句推断出 x 的类型是 string|number。如果再给 x 赋值为 boolean 类型则会报错,因为 boolean 类型不在联合类型 string|number 的范围之内,如果给 x 赋值为 string 类型的则不会报错。

控制流分析

基于可达性进行代码分析被称为控制流分析,可以基于类型守卫和赋值进行控制流分析。分析一个变量的时候,控制流可以进行拆分和合并,每个点都可以分析出变量对应的类型。

let x: number | string
if (Math.random() > 0.5) {
    x = 2
    console.log(x) // let x: number
} else {
    x = '34'
    console.log(x)  // let x: string
}
console.log(x) // let x: string | number

x 的最初类型是 number | string,进入 if 语句得出 x 的类型是 number,进入 else 语句后 x 的类型是 string,最后得出 x 的类型还是 number | string

never

可以在类型收窄的时候,从联合类型减少到没有类型,这时候可以使用 never 表示不可能存在的类型。

never 类型可以分配给其他类型,但是其他类型不能分配给 never。可以在 switch 语句中使用 never,这样可以在类型收窄的时候进行详尽的检查。

image.png

当 Shape 只有 Circle 类型的时候,可以正常在 default 选项中使用 never 类型。但是当 Shape 增加类型后会去掉 default 选项,这时候再使用 never 类型就会报错。

小结

本节主要在《重学 typescript 之类型收窄上》的基础上继续类型收窄的方式,包括赋值,控制流分析和 never 类型。

参考资料:www.typescriptlang.org/docs/handbo…