TS基础知识(一) | 8月更文挑战

228 阅读4分钟

1. TypeScript简介

  • JS易学易用,但容易出bug
  • 项目大的时候,难以维护
  • JS没有变量、函数参数 类型,变量类型、函数参数可动态改变,埋下安全隐患;面向对象写起来不容易
  • 开发较早较快,要考虑兼容性问题

1.1 TypeScript是什么?

  • TS是以JS为基础构建的语言,是JS的超集或者说扩展,可以在任何支持JS的平台中执行。

最主要的是引入了类型的概念。使变量类型从动态变为静态

  • TS不能被JS解析器直接执行。把TS编译后转译成JS执行。
  • 支持ES的新特性

1.2 TS增加了什么?

  • 类型
  • 变量类型
  • 添加ES不具备的新特性
  • 丰富的配置选项,可以选择编译成任意版本的ES
  • 强大的开发工具

2. TS开发环境搭建

  • 下载并安装node.js

  • 使用npm安装TS npm i -g typescript 检测安装命令:tsc

  • 创建一个ts文件

  • 使用tsc对ts文件进行编译

    • 进入命令行
    • 进入ts文件所在目录
    • 执行命令:tsc xxx.ts

3. TS基础语法

3.2 类型声明

  • 类型声明是TS非常重要的一个特点

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

  • 指定类型后,当为变量赋值时,TS编译器会自动检查值是否符合类型声明,符合则赋值,否则报错

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

  • 语法:

  • let 变量: 类型;
    ​
    let 变量: 类型 = 值;
    ​
    function fn(参数: 类型, 参数: 类型): 类型{
        ...
    }
    

3.3 自动类型判断

  • TS拥有自动的类型判断机制
  • 当对变量的声明和赋值是同时进行的,TS编译器会自动判断变量的类型
  • 所以如果你的变量的声明和赋值时同时进行的,可以省略掉类型声明
  • 类型:
类型例子描述
number1, -33, 2.5任意数字
string'hi', "hi", hi任意字符串
booleantrue、false布尔值true或false
字面量其本身限制变量的值就是该字面量的值
any*任意类型
unknown*类型安全的any
void空值(undefined)没有值(或undefined)
never没有值不能是任何值
object{name:'孙悟空'}任意的JS对象
array[1,2,3]任意JS数组
tuple[4,5]元组,TS新增类型,固定长度数组
enumenum{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 任意类型都可以,可以赋值给任意变量。如果变量没指定类型也没赋值,就是any类型(隐式any)。

    • let d: any = 4;
      d = 'hello';
      d = true;
      
  • unknown 可以赋任何类型的值,不能赋值给 别的类型 的变量。

    • let notSure: unknown = 4;
      notSure = 'hello';
      
  • void 空置,多用于设置函数返回值,不设置返回值时,返回值类型默认是void

    • let unusable: void = undefined;
      
    • function fn() : void {   }
      
  • 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编译器却并不清楚,此时,可以通过类型断言来告诉编译器变量的实际类型,断言有两种形式: 变量 as 类型

<类型>变量

-   第一种

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

-   第二种

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

使用场景: 在不知道类型时最好定义成unknown,在把一个unknown类型的变量赋值给别的类型时会报错,对其使用类型断言。

  • 定义对象的结构,对于对象属性的限制(对对象本身的限制没什么意义)

    •  let a: { 用来指定可以包含哪些属性,以及对属性类型限制 };
       // 语法:    { 属性名:属性值,属性名:属性值 }
       // 属性名?  表示属性是可选的
       let b: { name:string };
       
       //[propName: string]: any  表示任意类型的属性
       let c: { name: string, [propName: string]: any };
      
  • 定义函数的结构,对于函数参数和返回值的限制

    •  let d: (a:number, b: number) => number;
       // 语法:   (形参:类型, 形参:类型,...) => 返回值类型
      
  • string[] 表示字符串数组,number[]表示数值数组...

    • 数组的两种声明:

      • 类型[]
      • Array<类型>
  • 元祖:固定长度的数组

    • // 语法: [类型,类型,...]
      let h:[string,string];
      
  • 枚举 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;
       let l: myType;
       let m: myType;
       k = 2;