1、编译选项 - tsconfig.json
使用tsc --init命令生成tsconfig.json是一个JSON文件,添加配置文件后,只需执行以下命令
tsc --完成对整个项目的打包编译tsc -w --实时打包
配置选项:
include & exclude & files
include
- 定义希望被编译文件所在的目录
- 默认值:[“*/“]
//所有src目录和tests目录下的文件都会被编译 "include":["src/**/*", "tests/**/*"]
exclude
- 定义需要排除在外的目录
- 默认值:[“node_modules”, “bower_components”, “jspm_packages”]
//src下hello目录下的文件都不会被编译 "exclude": ["./src/hello/**/*"]
extends
- 定义被继承的配置文件
//当前配置文件中会自动包含config目录下base.json中的所有配置信息 "extends": "./configs/base"
- 定义被继承的配置文件
files 比较少用
- 指定被编译文件的列表,只有需要编译的文件少时才会用到
//列表中的文件都会被TS编译器所编译 "files": [ "core.ts", "sys.ts", "types.ts", "scanner.ts", "parser.ts", "utilities.ts", "binder.ts", "checker.ts", "tsc.ts" ]
- 指定被编译文件的列表,只有需要编译的文件少时才会用到
compilerOptions
compilerOptions中包含多个子选项,用来完成对编译的配置
target
- 设置ts代码编译的目标版本
- ES5(默认)、ES5、ES6/ES2015、ES7/ES2016、ES2017、ES2018、ES2019、ES2020、ESNext
//我们所编写的ts代码将会被编译为ES6版本的js代码 "compilerOptions": { "target": "ES6" }
lib
- 指定代码运行时所包含的库(宿主环境)
- ES5、ES6/ES2015、ES7/ES2016、ES2017、ES2018、ES2019、ES2020、ESNext、DOM、WebWorker、ScriptHost ……
//用了DOM这个库 才考研使用document.XXX "compilerOptions": { "lib": ["ES6", "DOM"], }
module
- 设置编译后代码使用的模块化系统
- CommonJS、UMD、AMD、System、ES2020、ESNext、None
//我们所编写的ts代码将会变成CommonJS的模块化导入导出 module.export * import() "compilerOptions": { "module": "CommonJS" }
outDir
- 编译后文件的所在目录
- 默认情况下,编译后的js文件会和ts文件位于相同的目录,设置outDir后可以改变编译后文件的位置
//编译后的js文件将会生成到dist目录 "compilerOptions": { "outDir": "dist" }
outFile
- 将所有的文件编译为一个js文件
默认会将所有的编写在全局作用域中的代码合并为一个js文件,如果module制定了None、System或AMD则会将模块一起合并到文件之中
"compilerOptions": { "outFile": "dist/app.js" }rootDir
- 指定代码的根目录,默认情况下编译后文件的目录结构会以最长的公共目录为根目录,通过rootDir可以手动指定根目录
"compilerOptions": { "rootDir": "./src" }
- 指定代码的根目录,默认情况下编译后文件的目录结构会以最长的公共目录为根目录,通过rootDir可以手动指定根目录
allowJs
- 是否对js文件编译
//当你的文件夹中有js文件是否要跟ts文件一起编译到输出 false则只有ts会被输出 "compilerOptions": { "allowJs": "true" }
- 是否对js文件编译
checkJs
- 是否对js文件进行检查
//开启后 会对js检查 "compilerOptions": { "checkJs": true }其他配置项
|
- removeComments
|
- 是否删除注释
- 默认值:false
| | —- | —- | |
- noEmit
|
- 不对代码进行编译
- 默认值:false
| |
- sourceMap
|
- 是否生成sourceMap
- 默认值:false
| | 严格检查 | | |
- strict 总开关设置以下所有严格检查
|
- 启用所有的严格检查,默认值为true,设置后相当于开启了所有的严格检查
| |
- alwaysStrict
|
- 总是以严格模式对代码进行编译
| |
- noImplicitAny
|
- 禁止隐式的any类型 (没有定义类型)
| |
- noImplicitThis
|
- 禁止类型不明确的this (因为this是被调用有指向性的)
| |
- strictBindCallApply
|
- 严格检查bind、call和apply的参数列表
| |
- strictFunctionTypes
|
- 严格检查函数的类型
| |
- strictNullChecks
|
- 严格的空值检查 (例如获取一个按钮添加事件,但按钮可能获取不到)
| |
- strictPropertyInitialization
|
- 严格检查属性是否初始化
| | 额外检查 | | |
- noFallthroughCasesInSwitch
|
- 检查switch语句包含正确的break
| |
- noImplicitReturns
|
- 检查函数没有隐式的返回值
| |
- noUnusedLocals
|
- 检查未使用的局部变量
| |
- noUnusedParameters
|
- 检查未使用的参数
| | 高级 | | |
- allowUnreachableCode
|
- 检查不可达代码 true | false
| |
- noEmitOnError
|
- 有错误的情况下不进行编译 默认值:false
|
- 是否对js文件进行检查
2、webpack
- 通常情况下,实际开发中我们都需要使用构建工具对代码进行打包,TS同样也可以结合构建工具一起使用,下边以webpack为例介绍一下如何结合构建工具使用TS。
- 步骤:
- 初始化项目
- 进入项目根目录,执行命令
npm init -y - 主要作用:创建package.json文件
- 进入项目根目录,执行命令
- 下载构建工具
npm i -D webpack webpack-cli webpack-dev-server typescript ts-loader html-webpack-plugin clean-webpack-plugin- 共安装了7个包
- 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中的清除插件,每次构建都会先清除目录
- webpack
- 共安装了7个包
- 根目录下创建webpack的配置文件webpack.config.js ```javascript const path = require(“path”); const HtmlWebpackPlugin = require(“html-webpack-plugin”); //生成html const { CleanWebpackPlugin } = require(“clean-webpack-plugin”); //清除打包目录
module.exports = { optimization:{ minimize: false // 关闭代码压缩,可选 },
entry: "./src/index.ts",
devtool: "inline-source-map",
devServer: {
//contentBase: './dist',//4.0
static: './dist',//5.0
},
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
environment: {
arrowFunction: false // 关闭webpack打包后的箭头函数(自己写的代码经过babel后可以转成非箭头函数,但webpack打包后会有一个),防止ie浏览器不支持,可选
}
},
//不写该项 模块化导入ts时会报错找不到
resolve: {
extensions: [".ts", ".js"] //配置省略文件路径的后缀名(引入时就可以不写文件后缀名了)
},
module: {
rules: [
{
test: /\.ts$/,
use: {
loader: "ts-loader"
},
exclude: /node_modules/
}
]
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
title:'TS测试'
}),
]
}
4. 根目录下`tst --init`命令 创建tsconfig.json,配置可以根据自己需要
```json
{
"compilerOptions": {
"target": "ES2015",
"module": "ES2015",
"strict": true
}
}
修改package.json添加如下配置
{ ...略... "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "webpack", "start": "webpack serve --open chrome.exe" }, ...略... }在src下创建ts文件,并在并命令行执行
npm run build对代码进行编译,或者执行npm start来启动开发服务器
3、Babel
- 经过一系列的配置,使得TS和webpack已经结合到了一起,除了webpack,开发中还经常需要结合babel来对代码进行转换以使其可以兼容到更多的浏览器,在上述步骤的基础上,通过以下步骤再将babel引入到项目中。
- 安装依赖包:
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语法
- @babel/core
- 修改webpack.config.js配置文件
如此一来,使用ts编译后的文件将会再次被babel处理,使得代码可以在大部分浏览器中直接使用,可以在配置选项的targets中指定要兼容的浏览器版本。...略... module: { rules: [ { test: /\.ts$/, use: [ { loader: "babel-loader", options:{ //设置预定的环境 presets: [ [ //指定环境的插件 "@babel/preset-env", { //要兼容的目标浏览器版本 "targets":{ "chrome": "58", "ie": "11" }, "corejs":"3",//用core-js3版本 "useBuiltIns": "usage"//使用core-js的方法 按需加载 } ] ] } }, { loader: "ts-loader", } ], exclude: /node_modules/ } ] } ...略...4、命名空间 namespace
命名空间最明确的目的就是解决重名问题, 利用namespace声明空间one.ts 提供一个命名空间
- 安装依赖包:
export namespace One {
export const myname = 'Amanda'
export function add(n: number, m: number): number {
return n + m
}
}
index.ts 导入使用
import { One } from './test'
//导入第二个 使用Two.xx
//import { Two } from './test2'
console.log(One.myname);
console.log(One.add(1, 2));
5、文件声明 d.ts
基本声明引用
当我们写一个js文件 ,该文件被ts文件引用时,由于没有声明文件,ts文件在使用时会报错,这时需要声明一个xx.d.ts文件来告诉引用该文件的ts文件 每个东西是做什么用的
案例如下
test.js
let myname = 'Jim'
function add(n, m) {
return n + m
}
function Person(name, age) {
this.name = name;
this.age = age
}
import { One } from './test'
console.log(One.add(1, 2));
import loadsh from 'lodash'
import './img.png'
test.d.ts 声明文件
//声明变量
declare let myname: string;
//声明函数
declare function add(n: number, m: number): number
//声明构造函数
declare class Person {
name: string;
age: number;
constructor(name: string, age: number)
}
//声明命名空间
declare namespace One {
export function add(n: number, m: number): number
}
//声明模块
declare module 'lodash' {
export function jpin(arr: any[]): void;
}
//声明模块图片
declare module '*.png'
第三方库
当使用第三方库时,我们需要引用它的声明文件,才能获得对应的代码补全、接口提示等功能
什么是声明语句
完整解决过程
- 执行
npm install jquery import JQuery from "jquery"—报错找不到模块- 声明一个
jQuery.d.ts或者下载声明文件npm install @types/jquery --save-dev下载后会在node_modules/@types路径下 - 此时仍旧报错 解决如下
//此时仍旧报错"此模块是使用 "export =" 声明的,只能在使用 "allowSyntheticDefaultImports" 标志时进行默认导入" //解决: //tsconfig.json { "compilerOptions": { "allowSyntheticDefaultImports":true } }解析过程
假如我们想使用第三方库jQuery```typescript / 当使用第三方库时,我们需要引用它的声明文件,才能获得对应的代码补全、接口提示等功能。 声明语句: 如果需要ts对新的语法进行检查, 需要要加载了对应的类型说明代码 declare var jQuery: (selector: string) => any; 声明文件: 把声明语句放到一个单独的文件(jQuery.d.ts)中, ts会自动解析到项目中所有声明文件 下载声明文件: npm install @types/jquery —save-dev /
jQuery(‘#foo’); // ERROR: Cannot find name ‘jQuery’.
这时,我们需要使用 declare var 来定义它的类型
```typescript
declare var jQuery: (selector: string) => any;
jQuery('#foo');
declare var 并没有真的定义一个变量,只是定义了全局变量 jQuery 的类型,仅仅会用于编译时的检查,在编译结果中会被删除。
一般声明文件都会单独写成一个 xxx.d.ts 文件
创建 01_jQuery.d.ts, 将声明语句定义其中, TS编译器会扫描并加载项目中所有的TS声明文件
下载第三方类库声明文件
有的第三方类库有自己的声明文件(如axios),有的则没有(如lodash),没有的需要下载对应
查询对应类库的声明文件https://www.typescriptlang.org/dt/search?search=
