2. TS类型标注
基础类型声明
就是为各种变量、方法参数和返回值等标注其数据类型
简单类型直接冒号 + 类型:
let foo: string = ''
function的标注为:参数后冒号 + 类型,返回值在括号后加冒号和类型:
function toString(num: number): string {
return String(num);
}
特殊类型:any、unknown、never
any
any 类型表示没有任何限制,该类型的变量可以赋予任意类型的值。相当于js原本的变量,可以赋任意数据类型的值。即TypeScript 不对其进行类型检查。应该尽量避免使用any类型,否则就失去了使用 TypeScript 的意义。
在类型推断中,如果无法推断出类型,TypeScript 就会认为该变量的类型是any。
类型污染:any类型的值能够与其他类型的变量进行运算等操作。而操作的结果也为any,还能继续进行各种数值运算。这样的操作污染了其他具有正确类型的变量,TypeScript 也检查不出错误,问题就这样留到运行时才会暴露。
unknown
与any含义相同,表示类型不确定,可能是任意类型,但是它的使用有一些限制,不像any那样自由,可以视为严格版的any。
和any一样所有类型的值都可以分配给unknown类型。不同之处在于,它不能直接使用。对应any类型的值,可以用于其他的任何运算和操作,而unknown在进行一些运算的时候提示报错,因为它unknown(不确定),而不是any(任意类型),除了比较运算(运算符==、===、!=、!==、||、&&、?)、取反运算(运算符!)、typeof运算符和instanceof运算符这几种,其他运算都会报错。
有一个概念叫“类型缩小”:
let a:unknown = 1;
if (typeof a === 'number') {
let r = a + 10; // 正确
}
因为经过了typeof a === 'number'可以确定a为number类型,所以能够进行a + 10的运算。
这样设计的目的是,只有明确unknown变量的实际类型,才允许使用它,防止像any那样可以随意乱用,“污染”其他变量。类型缩小以后再使用,就不会报错。
总之,unknown可以看作是更安全的any。一般来说,凡是需要设为any类型的地方,通常都应该优先考虑设为unknown类型。
never
即“空类型”,如不可能返回值的函数,返回值的类型就可以写成never,因为确实没有任何类型。
不能赋给它任何值,因为“值”都是有类型的。但是它可以赋值给任意其他类型。
为什么never类型可以赋值给任意其他类型呢?这也跟集合论有关,空集是任何集合的子集。TypeScript 就相应规定,任何类型都包含了never类型。因此,never类型是任何其他类型所共+有的,TypeScript 把这种情况称为“底层类型”(bottom type)。
any和unknown类型可以看成是所有其他类型的全集,包含了一切可能的类型。TypeScript 将这种类型称为“顶层类型”(top type),意为涵盖了所有下层。
类型推断
即类型声明并不是必需的,如果没有,TypeScript 会自己推断类型。也就是说你第一次为这个变量赋予了什么值,它就会被推断为什么类型。其后不能赋值为其他类型的值。TypeScript 也可以推断函数的返回值。
const命令声明的x是不能改变值的,声明时必须同时赋值,否则报错。而let声明了的变量如果没有赋值,则会被推断为any类型。
最好还是在开发时就加上,即使不加类型声明,依然是有效的 TypeScript 代码,只是这时不能保证 TypeScript 会正确推断出类型。
总结
小提示:
- TypeScript 规定,变量只有赋值后才能使用,否则就会报错。
- 运行原理:在运行时,会先将ts编译为js,在各大浏览器、Node环境中运行。TypeScript 官方提供的编译器叫做 tsc,可以将 TypeScript 脚本编译成 JavaScript 脚本。本机想要编译 TypeScript 代码,必须安装 tsc。
- 根据约定,TypeScript 脚本文件使用.ts后缀名,JavaScript 脚本文件使用.js后缀名。tsc 的作用就是把.ts脚本转变成.js脚本。
- 安装:npm install -g typescript
- TypeScript 允许将tsc的编译参数,写在配置文件tsconfig.json。只要当前目录有这个文件,tsc就会自动读取,所以运行时可以不写参数。
评论