TypeScript 快速入门

2023-11-16

目录

第一章 快速入门

0、TypeScript简介

1、TypeScript 开发环境搭建

2、基本类型

3、编译选项

4、webpack

5、Babel


第一章 快速入门

0、TypeScript简介

TypeScript是JavaScript的超集。

它对JS进行了扩展,向JS中引入了类型的概念,并添加了许多新的特性。

TS代码需要通过编译器编译为JS,然后再交由JS解析器执行。

TS完全兼容JS,换言之,任何的JS代码都可以直接当成JS使用。

相较于JS而言,TS拥有了静态类型,更加严格的语法,更强大的功能;TS可以在代码执行前就完成代码的检查,减小了运行时异常的出现的几率;TS代码可以编译为任意版本的JS代码,可有效解决不同JS运行环境的兼容问题;同样的功能,TS的代码量要大于JS,但由于TS的代码结构更加清晰,变量类型更加明确,在后期代码的维护中TS却远远胜于JS。

1、TypeScript 开发环境搭建

安装解析 TS 的工具包
  • 1. 打开 VSCode 终端。
  • 2. 输入安装命令: npm i -g typescript 敲回车,来安装(注意:需要联网)。
  • typescript:就是用来解析 TS 的工具包。提供了 tsc 命令,实现了 TS -> JS 的转化。
第一次使用ts-node命令报错
  • 使用 npm uni -g ts-node 卸载掉ts-node
  • 再使用 npm i -g ts-node@8.5.4下载旧一点的版本就不会了

2、基本类型

  • 类型声明
  • 类型声明是TS非常重要的一个特点
  • 通过类型声明可以指定TS中变量(参数、形参)的类型
  • 指定类型后,当为变量赋值时,TS编译器会自动检查值是否符合类型声明,符合则赋值,否则报错
  • 简而言之,类型声明给变量设置了类型,使得变量只能存储某种类型的值
  • 语法:
let 变量: 类型;

let 变量: 类型 = 值;

function fn(参数: 类型, 参数: 类型): 类型{
    ...
}

------------------------------------
// 声明一个变量a指定他的类型为number
let a: number

// a 的值设置为了numbe 在以后的过程中a的值只能是number
a = 18
// a = 'hello' //此行代码会报错 因为变量a的类型为number
let b: string
b = 'hello'
// b = 1

//如果声明和赋值是同时进行的,ts会自动进行类型检测
let c = true
// c = 1


// // JS是不考虑参数类型和个数的
// function sum(a, b) {
//     return a + b
// }
// console.log(sum(123, "456"));


function sum(a: number, b: number): number {
    return a + 'hello'//返回值的类型应该为number
}
console.log(sum(123, "456", 666));//应该为两个参数

自动类型判断

  • TS拥有自动的类型判断机制
  • 当对变量的声明和赋值是同时进行的,TS编译器会自动判断变量的类型
  • 所以如果你的变量的声明和赋值时同时进行的,可以省略掉类型声明

类型:

类型 例子 描述
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中新增类型

number

let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
let big: bigint = 100n;

boolean

let isDone: boolean = false;

string

let color: string = "blue";
color = 'red';

let fullName: string = `Bob Bobbington`;
let age: number = 37;
let sentence: string = `Hello, my name is ${fullName}.

I'll be ${age + 1} years old next month.`;

字面量

也可以使用字面量去指定变量的类型,通过字面量可以确定变量的取值范围

let color: 'red' | 'blue' | 'black';
let num: 1 | 2 | 3 | 4 | 5;

any

let d: any = 4;
d = 'hello';
d = true;

unknown

let notSure: unknown = 4;
notSure = 'hello';

void

let unusable: void = undefined;

never

function error(message: string): never {
  throw new Error(message);
}

object(没啥用)

let obj: object = {};

array

let list: number[] = [1, 2, 3];
let list: Array<number> = [1, 2, 3];

tuple

let x: [string, number];
x = ["hello", 10]; 

enum

enum Color {
  Red,
  Green,
  Blue,
}
let c: Color = Color.Green;

enum Color {
  Red = 1,
  Green,
  Blue,
}
let c: Color = Color.Green;

enum Color {
  Red = 1,
  Green = 2,
  Blue = 4,
}
let c: Color = Color.Green;

类型断言

有些情况下,变量的类型对于我们来说是很明确,但是TS编译器却并不清楚,此时,可以通过类型断言来告诉编译器变量的类型,断言有两种形式:

第一种

let someValue: unknown = "this is a string";
let strLength: number = (someValue as string).length;

第二种

et someValue: unknown = "this is a string";
let strLength: number = (<string>someValue).length;


//也可以使用字面量进行赋值
let a: 10
// a = 11 //报错 不能将类型“11”分配给类型“10”。

//可以用 | 来链接多个类型
let color: 'red' | 'blue'
color = "red"
color = 'blue'

let c: boolean | string
c = true
c = 'hello'

//any 表示任意类型,一个变量设置类型为any后,相当于对该变量关闭了语法检测
// 使用ts时不建议使用any
// let d: any

// 声明变量不指定类型,则ts解析器会自动判断变量类型为any (隐式any)
let d
d = 10
d = 'aa'
d = true

// unknown实际上是一个类型安全的any
// unknown类型的变量不能赋值给其他变量
let e: unknown
e = 'aa'

let s: string
// d的类型是any他可以赋值给任意变量
s = d


s = e //不能将类型“unknown”分配给类型“string”。
if (typeof e === 'string') {
    s = e
}

//类型断言,可以用来告诉解析器变量的实际类型
s = e as string //变量as类型
s = <string>e//<类型>变量

//void 用来表示空 以函数为例,就是没有返回值的函数
function fn(): void { }

//never 表示永远不会返回结果
function fn1(): never {
    throw new Error('报错了')
}


// object 表示一个对象
let a: object
a = {}
a = function () { }
//{}用来指定可以包含那些内容
// 语法{属性名:属性值}
//属性名后面加上?表示可选属性
let b: { name: string, age?: number }
b = { name: '孙悟空' }
// [xx: string]: any 表示任意类型的属性
let c: { name: string, [xx: string]: any }
c = { name: '猪八戒', age: 18, gender: "男" }

//设置函数的结构的类型声明
// 语法(形参:类型)=>返回值
let d: (a: number, b: number) => number
d = function (n1: number, b: number): number {
    return 10
}

//表示字符串数组
let e: string[]  //类型[]
e = ["a", "b"]

let g: Array<number> //array<>
g = [1, 2]

//元祖:元祖就是固定长度的数组
let h: [string, string] //[类型]
h = ['a', 'b']

// enum枚举
enum Gender {
    male = 1,
    Female = 0
}
let i: { name: string, gender: Gender }
i = {
    name: '孙悟空',
    gender: Gender.Female
}
console.log(i.gender === Gender.Female);
// & 表示同时
let j: { name: string } & { age: number }
j = { name: '孙悟空', age: 18 }

//类型的别名
type myType = 1 | 2 | 3
let k: myType

3、编译选项

自动编译文件

编译文件时,使用 -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

sourceMap

  • 是否生成sourceMap
  • 默认值:false

严格检查

  • strict 启用所有的严格检查,默认值为true,设置后相当于开启了所有的严格检查
  • alwaysStrict 总是以严格模式对代码进行编译
  • noImplicitAn 禁止隐式的any类型
  • noImplicitThis 禁止类型不明确的this
  • strictBindCallApply 严格检查bind、call和apply的参数列表
  • strictFunctionTypes 严格检查函数的类型
  • strictNullChecks 严格的空值检查
  • strictPropertyInitialization 严格检查属性是否初始化

额外检查

  • noFallthroughCasesInSwitch 检查switch语句包含正确的break
  • noImplicitReturns 检查函数没有隐式的返回值
  • noUnusedLocals 检查未使用的局部变量
  • noUnusedParameters 检查未使用的参数

高级

allowUnreachableCode 检查不可达代码

可选值:

  • true,忽略不可达代码
  • false,不可达代码将引起错误

noEmitOnError

  • 有错误的情况下不进行编译
  • 默认值:false
{
    /* tsconfig.json 是ts 编译器的配置文件 ,ts编译器可以根据他的信息来对代码进行编译
    include用来指定那些ts文件需要被编译
        路径 **表示任意目录
             *表示任意文件  
    */
    "include": [
        "src/**/*"
    ],
    // "exclude": [
    //     "./src/hello/**/*"
    // ]

    /* compilerOptions 编译器的选项 */
    "compilerOptions": {

        // target 用来指定ts被编译为的ES版本 
        //"ES3", "ES5", "ES6", "ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020", "ES2021", "ES2022", "ESNext".
        "target": "ES6",

        //module 指定模块化的规范
        // 'none', 'commonjs', 'amd', 'system', 'umd', 'es6', 'es2015', 'es2020', 'es2022', 'esnext', 'node12', 'nodenext'。
        "module": "es2015",
        
        //用来指定要使用的库
        // "ES5", "ES6", "ES2015", "ES2015.Collection", "ES2015.Core", "ES2015.Generator", "ES2015.Iterable", "ES2015.Promise", ...

        // "lib": ["aa"]

        //用来指定编译后的文件存放目录
        "outDir": "./dist",

        //将代码合并为一个文件.所有全局作用域中的代码会合并到一个文件中
        // "outFile": "./dist/app.js",

        //是否对js文件进行编译
        "allowJs": true,
        //是否检测js代码是否符合语法规范
        "checkJs": true,
        //是否移除注释
        "removeComments": true,
        //不生成编译后的文件
        "noEmit": false,
        //当有错误的时候不生成编译文件
        "noEmitOnError": false,

        //用来设置编译后的文件是否使用严格模式
        "alwaysStrict": true,
        
        //不允许使用隐式的any
        "noImplicitAny": true,

        //不允许不明确类型的this
        "noImplicitThis": true,
        
        //严格的检查空值
        "strictNullChecks": true,

        //所有严格检查的总开关
        "strict": true
    }
    
}

4、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的配置文件webpack.config.js

 
const path = require('path');
//自动创建html
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 清除文件
const { CleanWebpackPlugin } = require("clean-webpack-plugin");

//webpack配置信息都应该写在 module.exports 中
module.exports = {
    //指定入口文件
    entry: './src/index.ts',
    //打包文件所在的目录
    output: {
        path: path.resolve(__dirname, 'dist'),
        // 打包后文件的名字
        filename: 'bundle.js',
        //告诉webpack不使用箭头函数
        enviroument:{
            arrowFunction:false
        }

    },

    // 指定webpack打包时使用的模块
    module: {
        //指定加载规则
        rules: [
            {
                //指定规则生效的文件
                test: /\.ts$/,
                //要使用的loader
                use: 'ts-loader',
                //要排除的文件
                exclude: /node_modules/
            }
        ]
    },

    //配置webpack插件
    plugins: [
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            // title: '自定义'
            template: './src/index.html'
        })
    ],

    //用来设置引用模块
    resolve: {
        extensions: ['.ts', '.js']
    }
}

根目录下创建tsconfig.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来启动开发服务器

5、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语法
  • 修改webpack.config.js配置文件
...略...
module: {
    rules: [
        {
            //指定规则生效文件
            test: /\.ts$/,
            //要使用的loader
            use: [
               //配置loder
                {
                    //指定加载器
                    loader: "babel-loader",
                    //设置babel
                    options:{
                        //设置预定义的环境
                        presets: [
                            [
                                //指定环境插件
                                "@babel/preset-env",
                                 //配置信息
                                {
                                   浏览器兼容版本
                                    "targets":{
                                        "chrome": "58",
                                        "ie": "11"
                                    },
                                    //指定corejs的版本
                                    "corejs":"3",
                                      //使用corejs的方式为usage按需加载
                                    "useBuiltIns": "usage"
                                }
                            ]
                        ]
                    }
                },
                {
                    loader: "ts-loader",

                }
            ],
            exclude: /node_modules/
        }
    ]
}
...略...

如此一来,使用ts编译后的文件将会再次被babel处理,使得代码可以在大部分浏览器中直接使用,可以在配置选项的targets中指定要兼容的浏览器版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript 快速入门 的相关文章

随机推荐

  • VulnHub_Jangow: 1.0.1

    本文内容涉及程序 技术原理可能带有攻击性 仅用于安全研究和教学使用 务必在模拟环境下进行实验 请勿将其用于其他用途 因此造成的后果自行承担 如有违反国家法律则自行承担全部法律责任 与作者及分享者无关 主机信息 kali 192 168 31
  • Mysql超时重连解决方案3: 配置c3p0连接池(终极方案)

    前面的文章中 我介绍了修改mysql默认超时时间和配置proxool连接池的方法来解决Mysql超时重连的问题 方案1不推荐 它并没有从根本上解决问题 方案2可用 但配置相对复杂 所有才有了方案3 它既解决了关键问题 并且配置简单易懂 c3
  • Retrofit源码解析三——对接口方法参数注解的处理

    private Nullable ParameterHandler result null if annotations null for Annotation annotation annotations 核心就是这一句 实际上就是把前面
  • Firefox意外的服务器响应,WebSockets的无法解决的“意外地得到了延续帧”错误(Websockets unresolva...

    我知道了 事实证明 我当初采用的代码放在一个NULL字符后的握手响应报头的新行后 我没有注意到这一点 它看起来像一个 浏览器移动所有所接收的WebSocket消息通过离开单个NULL字符在前一次的认证响应被处理的字符缓冲区 以及b 这不是一
  • 2020美赛E题解题思路方法:淹溺在塑料中

    自20世纪50年代以来 由于塑料的用途多种多样 如食品包装 消费品 医疗器械和建筑等 塑料制造业呈指数级增长 虽然有显著的好处 但与塑料产量增加有关的负面影响也受到关注 塑料制品不易分解 难以处理 只有大约9 的塑料被回收利用 1 每年大约
  • Git命令参考手册

    git init 初始化本地git仓库 创建新仓库 git config global user name xxx 配置用户名 git config global user email xxx xxx com 配置邮件 git config
  • [NOIP1998 普及组] 阶乘之和

    题目描述 用高精度计算出 S 1 2 3 n n 50 其中 表示阶乘 定义为 n n n 1 n 2 1 例如 5 5 4 3 2 1 120 输入格式 一个正整数 n 输出格式 一个正整数 S 表示计算结果 输入输出样例 输入 1 3
  • 华为机试题:HJ107 求解立方根(python)

    文章目录 1 题目描述 2 Python3实现 3 知识点详解 1 input 获取控制台 任意形式 的输入 输出均为字符串类型 1 1 input 与 list input 的区别 及其相互转换方法 2 print 打印输出 3 whil
  • MyBatis中Like模糊查询的几种写法和注意点

    目录 友情提醒 第一章 Mybatis中SQL语句的模糊查询 1 1 第一种方式 直接双引号拼接 1 2 第二种方式 数据库为MySQL时用CONCAT 函数 1 3 第三种方式 bind元素 友情提醒 先看文章目录 大致了解知识点结构 直
  • spring cloud alibaba 学习(三)Nacos-NacosNamingService初始化流程

    1 NacosServiceManager 的创建 Configuration proxyBeanMethods false ConditionalOnDiscoveryEnabled ConditionalOnNacosDiscovery
  • linux shell脚本

    微信可以设置雪花昵称了 真漂亮 一 Shell中有许多预定义的特殊字符 n n是一个数字 大于10则用大括号括起来 12 代表程序的第n个参数 总共有多少个参数 指所有的参数 指所有的参数 上次命令执行的返回值 注意 我们发现 和 的意思是
  • 计算机网络-04 网络路由

    第四讲 网络路由 给每次数据传输确定一个端到端的路径 通常是找到两点之间的最小代价路径 保存在路由器的转发表FIB中 基于分布式计算 网络模型用无向图表示 节点是网络设备 路由器 节点间链路是带权重的边 权重即链路开销 可以是延迟 拥塞程度
  • PHP: 深入pack/unpack

    PHP作为一门为web而生的服务器端开发语言 被越来越多的公司所采用 其中不乏大公司 如腾迅 盛大 淘米 新浪等 在对性能要求比较高的项目中 PHP也逐渐演变成一门前端语言 用于访问后端接口 或者不同项目之间需要共享数据的时候 通常可以抽取
  • 外部中断库函数

    外部中断 STM32外部中断简介 GPIO 跟中断线的映射关系 主函数讲解 外部中断初始化函数 STM32外部中断简介 STM32 的每个 IO 都可以作为外部 中断的中断输入口 这点也是 STM32 的强大之处 STM32F103 的中断
  • selenium浏览器驱动下载

    Chrome谷歌浏览器 下载地址 http chromedriver storage googleapis com index html 不同的Chrome的版本对应的chromedriver exe 版本也不一样 下载时不要搞错了 如果是
  • 升压BOOST电路和降压BUCK电路最容易的理解

    升压电路框图 首先在了解BOOST电路时 要学会如何分析最简单的升压电路框图 如图 首先识别每个元件基本功能 电感 储能i电感 MOS管 开关作用 二极管 续流 电容 储能电容 了解升压电路的原理 要明白Vout和Vin的差别 所以我们从V
  • Centos 7 - Anaconda3 安装教程及报错集锦 - 取消自动激活 base 环境方法

    目录 序言 1 报错 WARNING cannot verify mirrors tuna tsinghua edu cn s certificate issued by C US O Let s Encrypt CN R3 Issued
  • 人工智能之深度学习-初始环境搭建(安装Anaconda3和TensorFlow2步骤详解)

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 前言 本篇文章
  • ubuntu16.04 编译ARM平台qt5.12.3

    环境 系统 ubuntu16 04 开发板 IMAX8 IMAX8交叉编译工具aarch64 linux gnu 编译步骤 1 配置交叉编译环境 sudo gedit etc bash bashrc 在最后一行加入交叉编译工具的bin目录
  • TypeScript 快速入门

    目录 第一章 快速入门 0 TypeScript简介 1 TypeScript 开发环境搭建 2 基本类型 3 编译选项 4 webpack 5 Babel 第一章 快速入门 0 TypeScript简介 TypeScript是JavaSc