Skip to content

TypeScript 基操之编译

本章介绍 TypeScript 的一些最基本的语法和用法。

TypeScript Playground

  • 值与类型
  • TS 编译
  • ts-node

类型擦除

“类型”是针对“值”的,是后者的一个元属性。每一个值在 TS 里面都是有类型的。比如3是一个值,它的类型是number

TypeScript 代码只涉及类型,不涉及值。所有跟“值”相关的处理,都由 JavaScript 完成。TypeScript 项目包含两种代码,一种是底层的“值代码”,另一种是上层的“类型代码”。TypeScript 的编译过程会进行类型擦除,把“类型代码”全部拿掉,只保留“值代码”。

TypeScript 编译

JavaScript 的宿主环境不认识 TypeScript 代码。所以,TypeScript 项目要想运行,必须先转为 JavaScript 代码,这个代码转换的过程就叫做“编译”(compile)。

TypeScript 官方没有做运行环境,只提供编译器(TypeScript Compiler,tsc)。编译时,会将类型声明和类型相关的代码全部删除,只留下能运行的 JavaScript 代码,并且不会改变 JavaScript 的运行结果。

因此,TypeScript 的类型检查只是编译时的类型检查,而不是运行时的类型检查。一旦代码编译为 JavaScript,运行时就不再检查类型了。

tsc 编译器

TypeScript 官方提供的编译器叫做 tsc,可以将 TypeScript 脚本编译成 JavaScript 脚本。

基本命令

  • 安装
bash
$ npm install -g typescript
bash
$ npx tsc -v
Version 5.7.3
  • 帮助信息
bash
$ tsc -h
$ tsc --all
  • 编译脚本
bash
$ tsc app.ts
$ tsc file1.ts file2.ts file3.ts
  • 参数

(1)--outFile

如果想将多个 TypeScript 脚本编译成一个 JavaScript 文件,使用--outFile参数。

bash
$ tsc file1.ts file2.ts --outFile app.js

(2)--outDir

编译结果默认都保存在当前目录,--outDir参数可以指定保存到其他目录。

bash
$ tsc app.ts --outDir dist

(3)--target

为了保证编译结果能在各种 JavaScript 引擎运行,tsc 默认会将 TypeScript 代码编译成很低版本的 JavaScript,即 3.0 版本(以es3表示)。这通常不是我们想要的结果。

这时可以使用--target参数,指定编译后的 JavaScript 版本。建议使用es2015,或者更新版本。

bash
$ tsc --target es2015 app.ts

(4)--noEmitOnError

编译过程中,如果没有报错,tsc命令不会有任何显示。所以,如果你没有看到任何提示,就表示编译成功了。

如果编译报错,tsc命令就会显示报错信息,但是这种情况下,依然会编译生成 JavaScript 脚本。

这是因为 TypeScript 团队认为,编译器的作用只是给出编译错误,至于怎么处理这些错误,那就是开发者自己的判断了。

如果希望一旦报错就停止编译,不生成编译产物,可以使用--noEmitOnError参数。

bash
$ tsc --noEmitOnError app.ts

上面命令在报错后,就不会生成app.js

(5)--noEmit

tsc 还有一个--noEmit参数,只检查类型是否正确不生成 JavaScript 文件。

$ tsc --noEmit app.ts

tsconfig.json

类似各种命令行模块的参数配置文件,tsc的编译参数可以写在配置文件tsconfig.json。只要当前目录有这个文件,tsc就会自动读取,所以运行时可以不写参数。

ts-node

ts-node 是一个非官方的 npm 模块,可以直接运行 TypeScript 代码。

使用时,可以先全局安装它。

bash
$ npm install -g ts-node

安装后,就可以直接运行 TypeScript 脚本。

bash
$ ts-node script.ts

上面命令运行了 TypeScript 脚本script.ts,给出运行结果。

如果不安装 ts-node,也可以通过 npx 调用它来运行 TypeScript 脚本。

bash
$ npx ts-node script.ts

上面命令中,npx会在线调用 ts-node,从而在不安装的情况下,运行script.ts

如果执行 ts-node 命令不带有任何参数,它会提供一个 TypeScript 的命令行 REPL 运行环境,你可以在这个环境中输入 TypeScript 代码,逐行执行。

bash
$ ts-node
>

上面示例中,单独运行ts-node命令,会给出一个大于号,这就是 TypeScript 的 REPL 运行环境,可以逐行输入代码运行。

bash
$ ts-node
> const twice = (x:string) => x + x;
> twice('abc')
'abcabc'
>

上面示例中,在 TypeScript 命令行 REPL 环境中,先输入一个函数twice,然后调用该函数,就会得到结果。

按下 Ctrl + d,或者输入.exit 退出这个 REPL 环境

如果只是想简单运行 TypeScript 代码看看结果,ts-node 不失为一个便捷的方法。