[toc]

TypeScript是js的超集,是一个可选的、静态的类型系统
官网:http://www.typescriptlang.org
中文网:https://www.tslang.cn

js的原罪

  • js语言本身的特性,决定了它无法适应大型的复杂项目

  • 弱类型:可以修改变量的数据类型

  • 解释型:只有在运行时才会确定语言的正确性

  • 使用了不存在的变量、函数或成员

  • 把一个不确定的类型当做一个确定类型处理

  • 在使用对象的属性时,而这个对象却是null或者undefined

TypeScript

  • 超集:包含了js的所有功能
  • 类型系统:对代码中所有的标识符(变量、函数、类型、返回值)进行类型检查。类型检查是在编译的时候,而非运行时
  • 可选的:可用可不用
  • 静态的:无论是浏览器还是node,都无法直接识别ts代码。

搭建TS开发环境

安装TS

全局安装typescript,它包含tsc命令,进行ts文件的编译

  1. $ sudo npm install -g typescript

TS配置文件

生成配置文件。当使用tsc进行编译时,如果再跟上文件名就会忽略配置文件

  1. $ tsc --init
  2. ## 会生成一个配置文件
  3. {
  4. "compilerOptions": { /* 基础编译配置 */
  5. "target": "es5", /* 配置编译目标代码的版本标准 */
  6. "module": "commonjs", /* 配置编译目标使用模块化标准 */
  7. "lib": ["es2016"], /* 指定在编译中包含库文件 */
  8. "outDir": "./dist", /* 指定在编译后的文件路径 */
  9. },
  10. "include":["./scr"] /* 指定在编译的目标目录 */
  11. }

使用第三方库简化流程

@types/node
@types是一个ts官方的类型库,其中包含了很多对js代码的类型描述。

  1. $ npm install @types/node --save-dev

ts-node 它是将ts代码在内存中完成编译,同时完成运行

  1. $ npm install ts-node -g
  2. # 使用
  3. $ ts-node ./scr/index.ts

nodemon 用来监测文件的变化,并进行重启

  1. $ npm install nodemon -g
  2. # 基本使用-监测所有文件变化
  3. $ nodemon --exec ts-node ./scr/index.ts
  4. # 监测ts文件变化 -e ts
  5. $ nodemon -e ts --exec ts-node ./scr/index.ts
  6. # 监测src文件夹下的ts文件变化 --watch src -e ts
  7. $ nodemon --watch src -e ts --exec ts-node ./scr/index.ts

TS基本语法

如何进行类型约束

  • 仅需要在变量、函数的参数、函数的返回值位置后加上:数据类型
  • ts在很多场景中可以完成类型推导
    -any: 表示任意类型,对该类型,ts不进行类型检查

基本类型

  • number:数字
  • string:字符串
  • boolean:布尔值
  • types[]/Array<types>:数组(types为数据类型)
  • object: 对象
  • null和undefined:它们是所有数据类型的子类型,可以赋值给其他类型,但是这样就会存在js中的同样问题,可以通过在配置文件中添加"strictNullChecks": true来更严格的进行空类型检查,而null和undefined还能赋值给自身。

其他常用类型

  • 联合类型
    将多种类型混合使用,通过类型保护进行判断,比如string | number
    类型保护:当对某个变量进行类型判断之后,在哦按段的语句块中便可以确定它的确切类型,typeof只能触发简单的数据类型保护

  • void类型
    通常用与约束函数的返回值,表示该函数没有任何返回值

  • never类型
    通常用与约束函数的返回值,表示该函数永远不可能结束

  • 字面量类型
    使用一个值进行约束,当数据类型为number、string、boolean、array时,必须等于字面量,当是对象是,可以约束对象内属性的类型,且必须有

  • 元祖类型(Tuple)
    一个固定长度的数组,并且数组中每一项元素的类型

  • any类型
    any类型可以绕过类型检查,因此,any类型的数据可以赋值给任意类型

  • 枚举类型
    枚举通常用与约束某个变量的取值范围。

类型别名

对已知的一些类型定义名称

  1. type User={
  2. name:string,
  3. age:number,
  4. gender:"男"|"女"
  5. }
  6. let u:User = {
  7. name:"guohh",
  8. age:18,
  9. gender:"男"
  10. }
  11. function getUser():User[]{
  12. return u;
  13. }