当前位置:网站首页>Typescript学习(一)
Typescript学习(一)
2022-07-29 02:53:00 【未入流的小邹】
TypeScript是什么?
1.一个以JavaScript为基础构建的语言,是JavaScript的超集。
2.它对JS进行了扩展,向JS中引入了类型的概念,并添加了许多新的特性。
3.它可以在任何支持JavaScript的平台上执行,不过不能直接被JS引擎执行,需要转化成JS代码。
4. TS完全兼容JS,换言之,任何的JS代码都可以直接当成JS使用。
5. 相较于JS而言,TS拥有了静态类型,更加严格的语法,更强大的功能;TS可以在代码执行前就完成代码的检查,减小了运行时异常的出现的几率;TS代码可以编译为任意版本的JS代码,可有效解决不同JS运行环境的兼容问题;同样的功能,TS的代码量要大于JS,但由于TS的代码结构更加清晰,变量类型更加明确,在后期代码的维护中TS却远远胜于JS。
TypeScript 开发环境搭建
1. 下载Node.js并安装
64位:https://nodejs.org/dist/v14.15.1/node-v14.15.1-x64.msi
32位:https://nodejs.org/dist/v14.15.1/node-v14.15.1-x86.msi
2. 使用npm全局安装typescript
进入命令行
输入:npm i -g typescript
输入:tsc 查看是否安装成功
3. 创建一个ts文件
4. 使用tsc对ts文件进行编译
进入命令行
进入ts文件所在目录
执行命令:tsc xxx.ts
TypeScript基本类型
类型声明
类型声明是TS非常重要的一个特点
通过类型声明可以指定TS中变量(参数、形参)的类型
指定类型后,当为变量赋值时,TS编译器会自动检查值是否符合类型声明,符合则赋值,否则报错
简而言之,类型声明给变量设置了类型,使得变量只能存储某种类型的值
自动类型判断
- TS拥有自动的类型判断机制
- 当对变量的声明和赋值是同时进行的,TS编译器会自动判断变量的类型
- 所以如果你的变量的声明和赋值时同时进行的,可以省略掉类型声明
// 声明一个变量a,同时指定它的类型为number
let a: number;
// a 的类型设置为了number,在以后的使用过程中a的值只能是数字
a = 10;
a = 'hello'; // 此行代码会报错,因为变量a的类型是number,不能赋值字符串
// 声明完变量直接进行赋值
let b: boolean = false;
// 如果变量的声明和赋值是同时进行的,TS可以自动对变量进行类型检测
let c = false;
c = true;
// JS中的函数是不考虑参数的类型和个数的
// function sum(a, b){
// return a + b;
// }
// console.log(sum(123, 456)); // 579
// console.log(sum(123, "456")); // "123456"
//在typescript中会提醒参数个数与类型
function sum(a: number, b: number): number{
return a + b;
}
let result = sum(123, 456);
所有类型展示
| 类型 | 例子 | 描述 |
|---|---|---|
| number | 1, -33, 2.5 | 任意数字 |
| string | ‘hi’, “hi”, hi | 任意字符串 |
| boolean | true、false | 布尔值true或false |
| 字面量 | 其本身 | 限制变量的值就是该字面量的值 |
| any | * | 任意类型 |
| unknown | * | 类型安全的any |
| void | 空值(undefined) | 没有值(或undefined) |
| never | 没有值 | 不能是任何值 |
| object | {name:‘孙悟空’} | 任意的JS对象 |
| array | [1,2,3] | 任意JS数组 |
| tuple | [4,5] | 元素,TS新增类型,固定长度数组 |
| enum | enum{A, B} | 枚举,TS中新增类型 |
// 也可以直接使用字面量进行类型声明
let a: 10;
a = 10;
// 可以使用 | 来连接多个类型(联合类型)
let b: "male" | "female";
b = "male";
b = "female";
let c: boolean | string;
c = true;
c = 'hello';
// any 表示的是任意类型,一个变量设置类型为any后相当于对该变量关闭了TS的类型检测
// 使用TS时,不建议使用any类型
// let d: any;
// 声明变量如果不指定类型,则TS解析器会自动判断变量的类型为any (隐式的any)
let d;
d = 10;
d = 'hello';
d = true;
// unknown 表示未知类型的值
let e: unknown;
e = 10;
e = "hello";
e = true;
let s:string;
// d的类型是any,它可以赋值给任意变量
s = d;
e = 'hello';
// unknown 实际上就是一个类型安全的any
// unknown类型的变量,不能直接赋值给其他变量
//如果直接赋值给变量s会报错因为变量不一致
if(typeof e === "string"){
s = e;
}
// 类型断言,可以用来告诉解析器变量的实际类型
/** * 语法: * 变量 as 类型 * <类型>变量 * * */
s = e as string;
s = <string>e;
// void 用来表示空,以函数为例,就表示没有返回值的函数
function fn(): void{
}
// never 表示永远不会返回结果
function fn2(): never{
throw new Error('报错了!');
}
// object表示一个js对象
let a: object;
a = {
};
a = function () {
};
// {} 用来指定对象中可以包含哪些属性
// 语法:{属性名:属性值,属性名:属性值}
// 在属性名后边加上?,表示属性是可选的
let b: {
name: string, age?: number};
b = {
name: '孙悟空', age: 18};
// [propName: string] 代表属性名必须为string any 表示任意类型的属性
let c: {
name: string, [propName: string]: any};
c = {
name: '猪八戒', age: 18, gender: '男'};
/* * 设置函数结构的类型声明: * 语法:(形参:类型, 形参:类型 ...) => 返回值 * */
let d: (a: number ,b: number)=>number;
// d = function (n1: string, n2: string): number{
// return 10;
// }
/* * 数组的类型声明: * 类型[] * Array<类型> * */
// string[] 表示字符串数组
let e: string[];
e = ['a', 'b', 'c'];
let g: Array<number>;
g = [1, 2, 3];
*
* 元组,元组就是固定长度的数组
* 语法:[类型, 类型, 类型]
* */
let h: [string, number];
h = ['hello', 123];
/* * enum 枚举 * * */
enum Gender{
Male,
Female
}
let i: {
name: string, gender: Gender};
i = {
name: '孙悟空',
gender: Gender.Male // 'male'
}
// console.log(i.gender === Gender.Male);
// &表示同时
let j: {
name: string } & {
age: number };
// j = {name: '孙悟空', age: 18};
// 类型的别名
type myType = 1 | 2 | 3 | 4 | 5;
let k: myType;
k = 2;
编译选项
自动编译文件
- 编译文件时,使用 -w 指令后,TS编译器会自动监视文件的变化,并在文件发生变化时对文件进行重新编译。
自动编译整个项目
如果直接使用tsc指令,则可以自动将当前项目下的所有ts文件编译为js文件。
但是能直接使用tsc命令的前提时,要先在项目根目录下创建一个ts的配置文件 tsconfig.json
tsconfig.json是一个JSON文件,添加配置文件后,只需只需 tsc 命令即可完成对整个项目的编译
配置选项:
{
/* tsconfig.json是ts编译器的配置文件,ts编译器可以根据它的信息来对代码进行编译 "include" 用来指定哪些ts文件需要被编译 路径:** 表示任意目录 * 表示任意文件 "exclude" 不需要被编译的文件目录 默认值:["node_modules", "bower_components", "jspm_packages"] */
"include": [
"./src/**/*"
],
/* compilerOptions 编译器的选项 */
"compilerOptions": {
// target 用来指定ts被编译为的ES的版本
// 'es3', 'es5', 'es6', 'es2015', 'es2016', 'es2017', 'es2018', 'es2019', 'es2020', 'esnext'
"target": "es2015",
// module 指定要使用的模块化的规范
// 'none', 'commonjs', 'amd', 'system', 'umd', 'es6', 'es2015', 'es2020', 'esnext'
"module": "es2015",
// lib用来指定项目中要使用的库
//'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es
//2018', 'es2019', 'es2020', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'webworker.iterable', 'scri
//pthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.r
//eflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.st
//ring', 'es2017.intl', 'es2017.typedarrays', 'es2018.asyncgenerator', 'es2018.asynciterable', 'es2018.intl', 'es2018.promise', '
//es2018.regexp', 'es2019.array', 'es2019.object', 'es2019.string', 'es2019.symbol', 'es2020.bigint', 'es2020.promise', 'es2020.s
//haredmemory', 'es2020.string', 'es2020.symbol.wellknown', 'es2020.intl', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable
//', 'esnext.intl', 'esnext.bigint', 'esnext.string', 'esnext.promise', 'esnext.weakref'
// "lib": ["es6", "dom"]
// outDir 用来指定编译后文件所在的目录
"outDir": "./dist",
// 将代码合并为一个文件
// 设置outFile后,所有的全局作用域中的代码会合并到同一个文件中
//"outFile": "./dist/app.js"
// 是否对js文件进行编译,默认是false
// "allowJs": true,
// 是否检查js代码是否符合语法规范,默认是false
// "checkJs": true,
// 是否移除注释
"removeComments": true,
// 不生成编译后的文件
"noEmit": false,
// 当有错误时不生成编译后的文件
"noEmitOnError": true,
// 所有严格检查的总开关
"strict": true,
// 用来设置编译后的文件是否使用严格模式,默认false
"alwaysStrict": true,
// 不允许隐式的any类型
"noImplicitAny": true,
// 不允许不明确类型的this
"noImplicitThis": true,
// 严格的检查空值
"strictNullChecks": true
}
}
webpack
通常情况下,实际开发中我们都需要使用构建工具对代码进行打包,TS同样也可以结合构建工具一起使用,下边以webpack为例介绍一下如何结合构建工具使用TS。
步骤:
初始化项目
- 进入项目根目录,执行命令
npm init -y- 主要作用:创建package.json文件
- 进入项目根目录,执行命令
下载构建工具
npm i -D webpack webpack-cli webpack-dev-server typescript ts-loader 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
const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const { CleanWebpackPlugin } = require("clean-webpack-plugin"); module.exports = { optimization:{ minimize: false // 关闭代码压缩,可选 }, entry: "./src/index.ts", devtool: "inline-source-map", devServer: { contentBase: './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测试' }), ] }
根目录下创建tsconfig.json,配置可以根据自己需要
{
"compilerOptions": {
"target": "ES2015",
"module": "ES2015",
"strict": true
}
}
``` 5. 修改package.json添加如下配置 - ```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来启动开发服务器
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配置文件
...略... 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中指定要兼容的浏览器版本。
边栏推荐
- C language: Little Lele and Euclid
- 扫雷简单版
- DataGrip 如何导出和恢复整个数据库数据,使用单个 SQL 文件
- 融云实时社区解决方案
- Day 5 experiment
- 数仓中概念术语解析
- Stm32c8t6 encoder motor speed measurement and Arduino photoelectric module speed measurement
- [QNX Hypervisor 2.2用户手册]9.11 ram(更新中)
- Why did I choose the test when the development salary was high?
- R language error: compilation failed for package '****‘
猜你喜欢

Jinshan cloud returns to Hong Kong for listing: Hong Kong stock rush of Chinese to B cloud manufacturers

Idea replaces the contents of all files

IDEA安装后无法启动

C language: Little Lele and hexadecimal conversion

会议OA项目之我的审批功能

12_ue4进阶_换一个更好看的人物模型

工科男生:20岁未满,平凡但不平庸

MySQL - the difference between count (field), count (primary key), count (1), count (*)

【机器人学习】机械臂抓手matlab运动学与admas动力学分析

混淆矩阵学习笔记
随机推荐
万字详解 Google Play 上架应用标准包格式 AAB
04 | 后台登录:基于账号密码的登录方式(上)
三子棋(玩家+电脑)
Idea replaces the contents of all files
HTB-Blocky
HTB-Blue
Day 5 experiment
Codeworks 5 questions per day (average 1500) - day 25
Flink kernel source code (VII) Flink SQL submission process
Tp5.0 applet users do not need to log in and directly obtain the user's mobile number.
向DataFrame中的特定位置添加一行
Seed random seed
Linux下安装MySQL8.0的详细步骤
Thirty years of MPEG audio coding
Why did I choose the test when the development salary was high?
JVM基础入门篇一(内存结构)
MySQL large table joint query optimization, large transaction optimization, avoiding transaction timeout, lock wait timeout and lock table
Notes on the sixth day
STP protocol (spanning tree protocol)
kubernetes-1.24.x 特性