TypeScript 入门 | 青训营笔记

59 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天,接下来是一些学习笔记以及我个人的思考和总结。

一、本堂课重点内容:

  1. TypeScript 历史及定义解析
  2. TypeScript 优势解读
  3. TypeScript 练习工具
  4. 联合交叉类型
  5. 类型保护与类型守卫
  6. 函数返回值类型
  7. TypeScript 工程应用

二、详细知识点介绍:

TypeScript 是一种给 JavaScript 添加特性的语言扩展。增加的功能包括:

  • 类型批注和编译时类型检查
  • 类型推断
  • 类型擦除
  • 接口
  • 枚举
  • Mixin
  • 泛型编程
  • 名字空间
  • 元组
  • Await

以下功能是从 ECMA 2015 反向移植而来:

-   类
-   模块
-   lambda 函数的箭头语法
-   可选参数以及默认参数
  • TypeScript: 静态类型的弱类型语言

    静态类型:

    • 可读性增强: 基于语法解析TSDoc,ide增强

    • 可维护性增强: 在编译阶段暴露大部分错误

      =》

      多人合作的大型项目中,获得更好的稳定性和开发效率

  • TypeScript的优点:

    • 包含于兼容所有的JS特性,支持共存
    • 支持渐进式引入与升级
  • 语法

const q = 'string'; => const q: string = 'string';

con r = null; => const r: null = null;

冒号后面接数据类型名称

函数重载

QQ截图20230130211348.png

数组类型

    /*「类型 +方括号」 表示*/
    type IArr1 = number[];
    /*泛型表示*/
    type IArr2 = Array<string | number | Record<string, number>>;
    /* 元祖表示 */
    type IArr3 = [number, number, string, string];
    /*接口表示*/
    interface IArr4 {
        [key: number]: any;
    }
    const arr1: IArr1 = [1, 2, 3, 4, 5, 6];
    const arr2: IArr2 = [1, 2,'3','4',{ a: 1 }];
    const arr3: IArr3 = [1, 2,'3','4'] ;
    const arr4: IArr4 = ['string', () => null, {}, []];

QQ截图20230130212001.png

TypeScript泛型

QQ截图20230130212601.png

QQ截图20230130212616.png

定义了泛型之后也就和正常类型一样去使用

泛型的一些高级语法:1.泛型约束;2.泛型参数的默认类型

QQ截图20230130212754.png

联合/交叉类型

微信截图_20230130213813.png 联合类型: IA | IB;联合类型表示一个值可以是几种类型之一

交叉类型: IA & IB;多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性

函数返回值类型

QQ截图20230130220515.png

TypeScript工程应用-Web

  • 配置webapack loader相关配置
  • 配置tsconfig.js文件
  • 运行webpack启动/打包
  • loader处理ts文件时,会进行编译与类型检查

ypeScript工程应用-Node

6.png

  • 安装Node与npm
  • 配置tsconfig.js文件
  • 使用npm安装tsc
  • 使用tsc运行编译得到js文件

三、实践练习例子:

    /*空类型,表示无赋值*/
    type IEmptyFunction = () => void;
    /*任意类型,是所有类型的子类型*/
    type IAnyType = any;
    /*枚举类型:支持枚举值到枚举名的正、反向映射*/
    enum EnumExample {
        add = '+',
        mult = '*',
    }
    EnumExample['add'] === '+'
    EnumExample['+'] === 'add';

    enum ECorlor { Mon, Tue, Wed, Thu, Fri, Sat, Sun };
    ECorlor['Mon'] === 0;
    ECorlor[0] === 'Mon';
    /*泛型*/
    type INumArr = Array<number>;

类型别名&类型断言

 /*通过type关键字定义了IObjArr的别名类型*/
    type IObjArr = Array<{
        key: string;
        [objKey: string]:any;
    }>
    function keyBy<T extends I0bjArr>(objArr: Array<T>) {
        /* 未指定类型时, result类型为{} */
        const result = objArr.reduce((res, val, key) => {
            res[key] = val;
            return res;
        },{});
        /*通过as关键字,断言result类型为正确类型*/
        return result as Record<string, T>;
    }

字符串 / 数字 字面量

     /* 允许指定字符串/数字必须的固定值 *
      /* IDomTag必须为html、body、div、span中的其一 */
    type IDomTag = 'html' | 'body' | 'div' | 'span';
     /* IOddNumber必须为1、3、5、7、9中的其一 */
    type IOddNumber = 1|3|5|7|9;

类型保护与类型守卫

   interface IA { a: 1, a1: 2 }
    interface IB { b: 1, b1: 2 }
    function log(arg: IA | IB) {
        /*报错:类型“IA |IB"上不存在属性"a"。类型"IB" 上不存在属性"a"*/
        /*结论:访问联合类型时,处于程序安全,仅能访问联合类型中的交集部分*/
        if (arg.a) {
            console.log(arg.a1)
        } else {
            console.log(arg.b1);
        }
    }





     //实现函数logBook类型
     //函数接受书本类型,并logger出相关特征
    function logBook(book: IBookItem) {
        //联合类型+类型保护=自动类型推断
        if (book.type === 'history') {
            console.log(book.range)
        } else {
            console.log(book.theme);
        }

通过一个联合类型和类型保护的方式,它就自动做了一个类型推断

四、课后个人总结:

重点是如何把JavaScript的代码给TypeScript类型化。

TypeScript的可读性和可维护性很重要。

TypeScript在工程中的应用非常广泛,需要深入学习,特别是在往后的开发中。

五、引用参考: juejin.cn/course/byte… juejin.cn/course/byte…