Note:TS

什么是TypeScript?

Typescript 是一个强类型的 JavaScript 超集,支持ES6语法,支持面向对象编程的概念,如类、接口、继承、泛型等。Typescript并不直接在浏览器上运行,需要编译器编译成纯Javascript来运行。

使用ts的好处是什么?

  • TypeScript是JavaScript的加强版,它给JavaScript添加了可选的静态类型和基于类的面向对象编程,
    它拓展了JavaScript的语法。所以ts的功能比js只多不少;
  • TS具有类型约束的功能, 在开发时就能给出编译错误, 而 JS 错误则需要在运行时才能暴露;
  • TS具有类型推断的功能,在开发的时候可以获得参数、变量的类型推断;
  • 作为强类型语言,可以明确知道数据的类型。代码可读性极强,几乎每个人都能理解。
  • TypeScript的数据类型:

    Boolean
    Number
    String
    Array
    Function
    Object
    Symbol
    undefined
    never

    any、unknown、never、void、 null、 undefined的区别

    any: 用于描述任意类型,不作任何约束,编译时会跳过对其的类型检查
    unknown: 表示未知类型,即写代码的时候还不知道具体会是怎么的数据类型
    never: 永不存在的值的类型,常用于表示永不能执行到终点的函数返回值,例如抛出异常或函数中执行无限循环的代码的函数返回值类型
    void: 表示无任何类型,例如函数没有返回值或者返回值为undefined
    undefined和null: 是所有类型的子类,可以把 null 和 undefined 赋值给 number 类型的变量。当你指定了 --strictNullChecks 标记,null 和 undefined 只能赋值给 void 和它们各自。

    never

    任何类型的值都不能赋值给never类型的变量,即使是any也不行,没有类型是never的子类型或可以赋值给never类型

    // 抛出异常
    function error(msg:string):never{
        throw new Error(msg)
    }// 抛出异常会直接中断程序运行,这样程序就运行不到返回值那一步了,即具有不可到达的终点,也就永不存在返回了
    // 死循环
    function loopForever():never{
        while(true){}
    } // 同样程序永远无法运行到函数返回值那一步  即永不存在返回
    

    unknown 和 any的区别:

  • 与any类似,所有类型都可以分配unknown类型
  • 与any不同的是,unknown类型的变量不允许赋值给类型any或unknown以外的变量,也不允许执行unknown类型变量的方法
    这种限制有很强的防御性,可以使用如下两种方法破解:
    // 方法一:使用类型断言缩小未知范围
    let notSure: unknown = 'TRY';
    const resultNotSure = (notSure as string).toLowerCase();
    console.log('resultNotSure', resultNotSure);
    
    // 方式二:使用类型守卫进行类型收缩
    let notSure: unknown = 'TRY';
    if (typeof notSure === 'string') {
        const resultNotSure = notSure.toLowerCase();
        console.log('resultNotSure', resultNotSure);
    

    使用枚举的好处:

    使用枚举可以清晰地表达意图或创建一组有区别的用例

  • 可读性强,语义化一些特殊的标记,如数字;
  • 可维护性强,有修改只需要在枚举的地方修改,不会牵一发而动全身。
  • 如何定义一个常量枚举?

    常量枚举其实就是是在 enum关键字前使用 const 修饰符

    const enum Enum1 {
    

    枚举和常量枚举的区别

    普通枚举: 在经过编译器编译后是一个对象,这个对象我们可以在程序运行时使用,使用者在编译阶段拿到的是枚举的引用;
    常量枚举: 常量枚举会在编译阶段被移除,不会被编译成一个对象,常量枚举成员在使用的地方被直接内联进来(拿的不是引用,而是值)

  • 枚举成员的值不可修改;
  • typescript 还支持反向映射,即可以通过值来获取键,可以通过 Enum1[key] 或者 Enum1.key 的方式获取到对应的值。不过反向映射只支持数字枚举。

  • const 用于变量, readonly 用于属性;
  • const 在运行时检查, readonly 在编译时检查;
  • const 声明的变量指向的那个内存地址不得改动,这意味着,const 一旦声明变量,就必须立即初始化,不能留到以后赋值;readonly 修饰的属性能确保自身不能修改属性,但是当你把这个属性交给其它并没有这种保证的使用者(允许出于类型兼容性的原因),他们能改变。
    注: TypeScript 中的只读修饰符,可以声明更加严谨的可读属性。通常在 interface 、 Class 、 type 以及 array 和 tuple 类型中使用它,也可以用来定义一个函数的参数。
  • //  被readonly 约束的对象
    const obj: { readonly a: number } = {
        a: 1,
    // 违背readonly 约束的可修改的函数
    function setObjFn(obj: { a: number }) {
        obj.a = 456;
    setObjFn(obj);
    

    declare