当前位置: 首页 > news >正文

TypeScript基础【学习笔记】

一、TypeScript 开发环境搭建

  1. 下载并安装 Node.js
  2. 使用 npm 全局安装 typescript
    • 进入命令行
    • 输入:npm i -g typescript
  3. 创建一个 ts 文件
  4. 使用 tsc 对 ts 文件进行编译
    • 进入命令行
    • 进入 ts 文件所在目录
    • 执行命令:tsc xxx.ts

二、基本类型

  • 类型声明

    • 通过类型声明可以指定 TS 中变量(参数、形参)的类型

    • 类新声明给变量设置了类型,使得变量只能存储某种类型的值

    • 语法:

      let 变量: 类型;
      let 变量: 类型 =;
      function fn(参数: 类型, 参数: 类型): 类型 {...
      }
      
  • 自动类型判断

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

    类型例子描述
    any*任意类型
    unknown*类型安全的 any
    void空值 (undefined)没有值 (或 undefined)
    never没有值不能是任何值
    tuple[4, 5]元组,固定长度数组
    enumenum(A, B)枚举
    // 使用字面量声明
    let a: 10;
    a = 10;// 可以使用 | 来连接多个类型(联合类型)
    let b: 'male' | "female";
    b = 'male';
    b = 'female';let c: boolean | string;// 相当于关闭了 TS 类型检测
    let d: any;
    // let d; // 隐式的 any
    d = 10;
    d = 'hello';
    d = true;let e: unknown;
    e = 10;
    e = 'hello';
    e = true;let s: string;
    // d: any,可以赋值给任意变量
    // s = d;
    e = 'hello';
    // unknown 类型的变量不能直接赋值给其他变量
    if (typeof e === 'string') {s = e; // 类型不同
    }// 类型断言
    s = e as string;
    s = <string>e;function fn(): void {return;
    }function fn2(): never {throw new Error('报错了');
    }// 变量后面加上一个 ?表示属性是可选的
    let b: {name: string, age?: number};
    b = {name: 'abc', age: 18}; // 需要 name 属性let c: {name: string, [propName: string]: any};
    c = {name: 'aaa', age: 18, gender: 'male'}; // 设置函数结构的类型声明:
    // 语法:(形参: 类型, 形参: 类型 ...) => 返回值
    let d: (a: number, b: number) => number;
    // d = function(n1: string, n2: string): number {
    //     return 10;
    // } // 报错let e: string[]; // 表示字符串数组
    e = ['a', 'b', 'c'];
    let f: number[];
    f = [1, 2, 3]
    let g: Array<number>;
    g = [1, 2, 3];// 
    let h: [string, number]; // 元组
    h = ['hello', 123];// enum
    enum Gender {Male = 0,Female = 1
    }
    let i: {name: string, gender: Gender};
    i = {name: 'abc',gender: Gender.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;
    let l: myType;
    let m: myType;
    k = 5;
    

三、编译选项

1、自动编译文件

  • 编译文件时,使用 -w 指令后,TS 编译器会自动监视文件的变化,并在文件发生变化时对文件进行重新编译
  • 示例:
    tsc xxx.ts -w

2、自动编译整个项目

  • 直接使用 tsc 指令,可以自动将当前项目下的所有 ts 文件编译为 js 文件

  • 直接使用 tsc 命令的前提时要现在项目根目录下创建一个 ts 的配置文件 tsconfig.json

  • 配置选项:

    • include

      • 定义希望被被编译文件所在目录
      • 默认值:["**/*"]
      • 示例:“include”: ["src/**/*", "tests/**/*"]
    • exclude

      • 定义需要排除在外的目录
      • 默认值:["node_modules", "bower_components", "jspm_packeages"]
      • 示例:“exclude”: ["./src/hello/**/*"]
    • extends

      • 定义被继承的配置文件
      • 示例:“extend”: "./configs/base"
    • files

      • 指定被编译文件的列表,只有需要编译的文件少时才会用到

      • 示例:

        "files": ["core.ts","sys.ts","types.ts",...
        ]
        
    • compilerOptions

      • 编译选项是配置文件中非常重要也比较复杂的配置选项

      • 在 compilerOptions 中包含多个子选项,用来完成对编译的配置

        • 项目选项

          • target

            • 设置 ts 代码编译的目标版本

            • 可选值:
              ES3(默认)、ES5、ES6/ES2015、ES7/ES2016、ES2017、ES2018、ES2019、ES2020、ESNext

            • 示例:

              "compilerOptions": {"target": "ES6"
              }
              
          • 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"
              }
              

          示例:

          {"include": ["./src/**/*" // **:表示任意目录  *:表示任意文件],// "exclude": [//     "./src/hello/**/*"// ],"compilerOptions": {"target": "ES2015","module": "ES6",// "lib": ["es6", "dom"],"outDir": "./dist", // 用来指定编译后文件所在的目录// "outFile": "./dist/app.js"   // 将代码合并为一个文件"allowJs": true, // 是否对 js 文件进行编译"checkJs": true,    // 是否检查 js 代码是否符合规范"removeComments": true, // 是否移除注释"noEmit": false, // 不生成编译后的文件"noEmitOnError": true,  // 当有错误时不生成编译后的文件"strict": true,    // 所有严格检查的总开关"alwaysStrict": true,  // 用来设置编译后的文件是否使用严格模式"noImplicitAny": true,  // 不允许隐式的 any 类型"noImplicitThis": true,    // 不允许不明确类型的 this"strictNullChecks": true,  // 严格地检查空值}
          }
          

3、webpack

  1. 初始化项目

    • 进入项目根目录,执行命令 npm init -y:创建 package.json 文件
  2. 下载构建工具
    npm i -D webpack webpack-cli webpack-dev-server typescript ts-loader clean-webpack-plugin

    • 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 中的清除插件,每次构建都会先清除目录
  3. 根目录下创建 webpack 的配置文件 webpack.config.js

    const path = require('path');
    const HTMLWebpackPlugin = require('html-webpack-plugin');
    const { CleanWebpackPlugin } = require('clean-webpack-plugin');// 写入 webpack 的所有配置信息
    module.exports = {// 指定入口文件entry: "./src/index.ts",// 指定打包文件所在位置output: {// 指定打包文件的目录path: path.resolve(__dirname, 'dist'),// 打包后的文件filename: 'bundle.js',// 不使用 箭头函数environment: {arrowFunction: false}},// 指定 webpack 打包时使用的模块module: {// 指定要 load 的 rulerules: [{// test 指定规则生效的文件test: /\.ts$/,// 要使用的 loaderuse: [// 配置 babel{// 指定加载器loader: "babel-loader",// 设置 babeloptions: {// 设置预定义的环境presets: [[// 指定环境插件"@babel/preset-env",// 配置信息{// 要兼容的目标浏览器targets: {'chrome': "127",'ie': '11'},// 指定 core-js 的版本"corejs": "3",// 使用 corejs 的方式"useBuiltIns": "usage" // 表示按需加载}]]}},'ts-loader'],// 要排除的文件exclude: /node-module/}]},// 配置 webpack 插件plugins: [new CleanWebpackPlugin(),new HTMLWebpackPlugin({// title: "这是一个自定义的 title"template: "./src/index.html"}),],resolve: {extensions: ['.ts', '.js']}
    };
    

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Rabbit高级特性 - 消息重试机制(两种实现)
  • nextjs 实现TodoList网页应用案例
  • 分布式存储ceph知识点整理
  • Flink单机和集群环境部署教程
  • opencv 三维重建基础
  • PDF转Markdown的利器(MinerU版)
  • jupyter项目使用Anaconda环境内核
  • 算法---动态规划专练(1)
  • Spring boot tomcat使用自定义线程池监控线程数量告警
  • 云手机在海外社交媒体运营中的作用
  • 【视觉SLAM】 十四讲ch7习题
  • 使用Docker Compose进行容器编排的最佳实践
  • 产业园物业满意度调研指标设计
  • c++中的标准库
  • C++标准模板(STL)- 类型支持 (类型属性,检查类型是否拥有强结构相等性,std::has_strong_structural_equality)
  • 【Leetcode】101. 对称二叉树
  • @jsonView过滤属性
  • 《Java编程思想》读书笔记-对象导论
  • C# 免费离线人脸识别 2.0 Demo
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CentOS 7 防火墙操作
  • exif信息对照
  • JavaScript的使用你知道几种?(上)
  • Kibana配置logstash,报表一体化
  • LintCode 31. partitionArray 数组划分
  • Markdown 语法简单说明
  • PHP 小技巧
  • SQLServer之创建显式事务
  • Vultr 教程目录
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 分享一份非常强势的Android面试题
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 深度学习中的信息论知识详解
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一道面试题引发的“血案”
  • 一些css基础学习笔记
  • 怎么将电脑中的声音录制成WAV格式
  • 正则表达式
  • AI算硅基生命吗,为什么?
  • ​ssh免密码登录设置及问题总结
  • ​水经微图Web1.5.0版即将上线
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 职场生活之道:善于团结
  • ## 基础知识
  • #AngularJS#$sce.trustAsResourceUrl
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • %@ page import=%的用法
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (力扣题库)跳跃游戏II(c++)
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (五)网络优化与超参数选择--九五小庞
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决