共计 5548 个字符,预计需要花费 14 分钟才能阅读完成。
TypeScript 介绍
TypeScript(简称TS)是 JavaScript 的超集(JS有的TS都有)
TypeScript = Type + JavaScript(在JS基础之上,为 JS 添加了类型支持)
TypeScript 是微软开发的开源编程语言,可以在任何运行 JavaScript 的地方运行
// TypeScript 代码:有明确的类型,即 : nmber (数值类型)
let age1: number = 18
// JavaScript 代码:无明确的类型
let age2 = 18
背景:JS 的类型系统存在 “先天缺陷”,JS 代码中绝大部分错误都是类型错误(Uncaught TypeError)
问题:增加了找 Bug、改 Bug 的时间,严重影响开发效率
从编程语言的动静来区分,TypeScript 属于静态类型的编程语言,JS 属于动态类型的编程语言
静态类型:编译期做类型检查;动态类型:执行期做类型检查
代码编译和代码执行的顺序:1 编译 2 执行
对于 JS 来说:需要等到代码真正去执行的时候才能发现错误(晚)
对于 TS 来说:在代码编译的时候(代码执行前)就可以能发现错误(早)
并且,配合 VSCode 等开发工具,TS 可以提前到在编写代码的同时就发现代码中的错误,减少找Bug、改Bug时间
- 更早(写代码的同时)发现错误,减少找Bug、改Bug时间,提高开发效率
- 程序中任何位置的代码都有代码提示,增强开发体验
- 更强大的类型系统提升了代码的可维护性,使得重构代码更加容易
- 支持最新的 ECMAScript 语法,优先体验最新的语法
- TS 类型推断机制,不需要再代码中的每个地方都显示标注类型
除此之外,Vue3 源码使用 TS 重写、Angular 默认支持 TS、React 与 TS 完美配合,TypeScript 已成为大中型前端项目的首先编程语言
TypeScript 使用
安装编译 TS 的工具包
Node.js/浏览器,只认识JS代码,不认识TS代码。需要先将TS代码转化为JS代码,然后才能运行
# 安装命令
npm i -g typescript
#查看 typescript 的版本
tsc -v
- 自动编译文件
- 编译文件时,使用
-w
指令后,TS 编译器会自动监视文件的变化,并在文件发生变化时对文件进行重新编译
tsc xxx.ts -w
typescript包:用来编译TS代码的包,提供了 tsc
命令,实现了 TS -> JS 的转化
# 安装命令
npm i -g ts-node
# 使用方式
ts-node hello.ts
编译选项
自动编译文件
编译文件时,使用 -w
指令后,TS 编译器会自动监视文件的变化,并在文件发生变化时对文件进行重新编译
tsc xxx.ts -w
自动编译整个项目
- 如果直接使用 tsc 指令,则可以自动将当前项目下的所有 ts 文件编译为 js 文件。
- 但是能直接使用 tsc 命令的前提时,要先在项目根目录下创建一个 ts 的配置文件 tsconfig.json
- tsconfig.json 是一个 JSON 文件,添加配置文件后,只需只需 tsc 命令即可完成对整个项目的编译
配置选项:
include
- 定义希望被编译文件所在的目录
- 默认值:
["**/*"]
{
"include":["src/**/*", "tests/**/*"]
}
上述示例中,所有 src 目录和 tests 目录下的文件都会被编译,
**
表示任意目录、*
表示任意文件
exclude
- 定义需要排除在外的目录
- 默认值:
["node_modules", "bower_components", "jspm_packages"]
{
"exclude": ["./src/hello/**/*"]
}
上述示例中,src 下 hello 目录下的文件都不会被编译
extends
- 定义被继承的配置文件
{
"extends": "./configs/base"
}
上述示例中,当前配置文件中会自动包含 config 目录下 base.json 中的所有配置信息
files
- 指定被编译文件的列表,只有需要编译的文件少时才会用到
{
"files": [
"core.ts",
"sys.ts",
"types.ts",
"scanner.ts",
"parser.ts",
"utilities.ts",
"binder.ts",
"checker.ts",
"tsc.ts"
]
}
列表中的文件都会被TS编译器所编译
compilerOptions
- 编译选项是配置文件中非常重要也比较复杂的配置选项
- 在
compilerOptions
中包含多个子选项,用来完成对编译的配置 target
设置 ts 代码编译的目标版本,可选值:ES3(默认)、ES5、ES6/ES2015、ES7/ES2016、ES2017、ES2018、ES2019、ES2020、ESNext
"compilerOptions": {
"target": "ES6"
}
如上设置,所编写的 ts 代码将会被编译为 ES6 版本的 js 代码
lib
指定代码运行时所包含的库(宿主环境),可选值:ES5、ES6/ES2015、ES7/ES2016、ES2017、ES2018、ES2019、ES2020、ESNext、DOM、WebWorker、ScriptHost ……
"compilerOptions": {
"target": "ES6",
"lib": ["ES6", "DOM"],
"outDir": "dist",
"outFile": "dist/aa.js"
}
module
设置编译后代码使用的模块化系统,可选值:CommonJS、UMD、AMD、System、ES2020、ESNext、None
"compilerOptions": {
"module": "CommonJS"
}
outDir
编译后文件的所在目录,默认情况下,编译后的 js 文件会和 ts 文件位于相同的目录,设置 outDir 后可以改变编译后文件的位置
"compilerOptions": {
"outDir": "dist"
}
设置后编译后的 js 文件将会生成到 dist 目录
outFile
将所有的文件编译为一个js文件,默认会将所有的编写在全局作用域中的代码合并为一个 js 文件,如果 module 制定了 None、System 或 AMD 则会将模块一起合并到文件之中
"compilerOptions": {
"outFile": "dist/app.js"
}
rootDir
指定代码的根目录,默认情况下编译后文件的目录结构会以最长的公共目录为根目录,通过 rootDir 可以手动指定根目录
"compilerOptions": {
"rootDir": "./src"
}
allowJs
是否对 js 文件编译checkJs
是否对 js 文件进行检查
"compilerOptions": {
"allowJs": true,
"checkJs": true
}
removeComments
是否删除注释,默认值:false
noEmit
不对代码进行编译,默认值:false
noEmitOnError
当有错误时不生成编译后的文件,默认值false
sourceMap
是否生成 sourceMap,默认值:false
- 严格检查
- strict
- 启用所有的严格检查,默认值为true,设置后相当于开启了所有的严格检查
- alwaysStrict
- 总是以严格模式对代码进行编译
- noImplicitAny
- 禁止隐式的any类型
- noImplicitThis
- 禁止类型不明确的this
- strictBindCallApply
- 严格检查bind、call和apply的参数列表
- strictFunctionTypes
- 严格检查函数的类型
- strictNullChecks
- 严格的空值检查
- strictPropertyInitialization
- 严格检查属性是否初始化
- 额外检查
- noFallthroughCasesInSwitch
- 检查switch语句包含正确的break
- noImplicitReturns
- 检查函数没有隐式的返回值
- noUnusedLocals
- 检查未使用的局部变量
- noUnusedParameters
- 检查未使用的参数
- 高级
- allowUnreachableCode
- 检查不可达代码
- 可选值:
- true,忽略不可达代码
- false,不可达代码将引起错误
- noEmitOnError
- 有错误的情况下不进行编译
- 默认值:false
webpack
通常情况下,实际开发中我们都需要使用构建工具对代码进行打包,TS 同样也可以结合构建工具一起使用,下边以 webpack 为例介绍一下如何结合构建工具使用 TS
步骤 1
- 初始化项目
进入项目根目录,执行命令npm init -y
主要作用:创建package.json
文件
步骤 2
- 下载构建工具
npm i -D webpack webpack-cli webpack-dev-server typescript ts-loader clean-webpack-plugin html-webpack-plugin
共安装了 8 个包
webpack
构建工具webpack
webpack-cli
webpack 的命令行工具webpack-dev-server
webpack 的开发服务器typescript
ts 编译器ts-loader
ts 加载器,用于在 webpack 中编译 ts 文件html-webpack-plugin
webpack 中 html 插件,用来自动创建 html 文件clean-webpack-plugin
webpack 中的清除插件,每次构建都会先清除目录html-webpack-plugin
帮助我们自动生成 html 文件
步骤 3
根目录下创建 webpack
的配置文件 webpack.config.js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
module.exports = {
mode: 'development', // development开发环境、production生产环境
optimization:{
minimize: false // 关闭代码压缩,可选
},
entry: "./src/index.ts",
devtool: "inline-source-map",
/* devServer: {
contentBase: './dist'
}, */
devServer: {
static: {
directory: path.join(__dirname, './dist')
}
},
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
environment: {
arrowFunction: false // 关闭webpack的箭头函数,可选
}
},
resolve: {
extensions: [".ts", ".js"]
},
module: {
rules: [
{
test: /\.ts$/,
use: {
loader: "ts-loader"
},
exclude: /node_modules/
}
]
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
title:'TS测试',
// template:'./src/index.html' // html模板
}),
]
}
步骤 4
根目录下创建 tsconfig.json,配置可以根据自己需要
{
"compilerOptions": {
"target": "ES2015",
"module": "ES2015",
"strict": true
}
}
步骤 5
修改 package.json 添加如下配置
{
...略...
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"start": "webpack serve --open"
},
...略...
}
步骤 6
在 src 下创建 ts 文件,并在并命令行执行 npm run build
对代码进行编译,或者执行 npm start
来启动开发服务器
Babel
经过一系列的配置,使得 TS 和 webpack 已经结合到了一起,除了 webpack,开发中还经常需要结合 babel 来对代码进行转换以使其可以兼容到更多的浏览器,在上述步骤的基础上,通过以下步骤再将 babel 引入到项目中
步骤 1
安装依赖包:npm i -D @babel/core @babel/preset-env babel-loader core-js
共安装了4个包,分别是:
@babel/core
babel 的核心工具@babel/preset-env
babel 的预定义环境@babel-loader
babel 在webpack
中的加载器core-js
core-js 用来使老版本的浏览器支持新版 ES 语法
步骤 2
修改 webpack.config.js 配置文件
...略...
module: {
rules: [
{
test: /\.ts$/,
use: [
{
loader: "babel-loader",
options:{
presets: [
[
"@babel/preset-env",
{
"targets":{
"chrome": "58",
"ie": "11"
},
"corejs":"3",
"useBuiltIns": "usage"
}
]
]
}
},
{
loader: "ts-loader",
}
],
exclude: /node_modules/
}
]
}
...略...
如此一来,使用 ts 编译后的文件将会再次被 babel 处理,使得代码可以在大部分浏览器中直接使用,可以在配置选项的 targets 中指定要兼容的浏览器版本。