Skip to content

Typescript学习笔记 ​

  1. 基础类型&对象类型
ts
  //基础类型:null 、undefined 、void 、symbol 、boolean 、number 、string
  let num:number = 1;
  let str:string = 'hello';
  let count; //先声明后赋值,TS会认为any类型
  count = 1;

  //对象类型 {} 、class 、function 、[]
  let obj:{
    name:string,
    age:number
  } = {
    name:'hello',
    age:18
  }

  let arr:(number | string)[] = [1,'32',3];

  class Person{}
  const dell:Person = new Person('hello',18);

  //1. 函数类型注解写法1(这种写法返回值类型可以不写)
  const getTotal = (str: string): number => {
    return parseInt(str, 10);
  }
  //2. 函数类型注解写法2(这种写法返回值必须写类型,否则语法不对)
  const getTotal: (str: string) => number = (str) => {
    return parseInt(str, 10);
  }
  1. 类型注解&类型推断
ts
   //type annotation 类型注解: 告诉编译器变量的类型
   let num:number = 1;
   
   //type inference 类型推断: 编译器自动推断变量的类型
   let num = 1;

   //如果TS能够自动分析出变量类型,可以不写类型注解 
    function getTotal(num1: number, num2: number): number {  //需要注解,返回值注解是为了调用的时候能知道返回的是什么类型
      return num1 + num2;
    }

    const total = getTotal(1, 2);  //不需要注解

    //返回值为空的函数返回值类型为void
    function sayHello(name: string): void {  
      console.log(`Hello, ${name}`);
    }

    //无法执行完毕的函数 返回值类型为never
    function error(message: string): never {  
      throw new Error(message);
    }
    
    //解构赋值的函数类型注解
    function add({ name, age }: { name: string; age: number }) {}
  1. 类型别名
ts
  //type alias 类型别名
  type User = { name: string; age: number }
  const objectArr: User[] = [{ name: 'hello', age: 18 }];

  //元组 tuple 数量有限,各项类型有限的数组
  const teacherInfo:[ string, number, boolean ] = ['hello', 18, true ]
  1. Interface接口(不会编译成js,仅做类型校验)
ts
  //interface和类型别名类似,但是interface可以添加任意属性
  interface Person {
      name: string;   //必选属性
      age?: number;   //可选属性
      readonly sex: string; //只读属性
      [propName: string]: any;  //任意属性
  }

  const getPerson = (person: Person): void => {
      console.log(person);
  }

  const person = {
      name: 'dlcjh',
      age: 18,
      sex: '男',
      address: '中国'
  }

  getPerson(person)  //不报错,用对象接收了
  getPerson({
      name: 'dlcjh',
      address: '中国'
  })  //可能报错,直接传递对象字面量会进行强校验

  class User implements Person { //类 应用接口
      name: string;
      age: number;
      sex: string;
      address: string;
      constructor(name: string, age: number, sex: string, address: string) {
          this.name = name;
          this.age = age;
          this.sex = sex;
          this.address = address;
      }
  }

  interface Teacher extends Person { //接口继承
      teach(): void;
  }

  interface SayHi { //函数类型接口
      (word : string) : void;
  }
  1. 静态类型的深度理解
  • 当指定静态类型的时候,被指定的变量会具备静态类型的所有属性和方法