TypeScript常用类型

109 阅读5分钟

类型注解

let age: number = 18
// 说明: :number就是类型注解
// 作用: 为变量添加类型约束,约定number为数值类型
// 解释: 约定了什么类型,只能给变量赋值该类型的值,否则代码报错

常用类型概述

TS类型,基础类型细分为2类:js已有类型、ts新增类型

js已有类型

基础类型:number、string、Boolean、null、undefined、symbool 对象类型:object(包括数组、对象、函数)

  • 原始类型
let age: number = 18 // number类型
let bool: boolean = false // boolean类型
let name: string = 'zs' // string类型
  • 对象类型 TS中对每个具体的对象都有自己的类型语法
// 数组 又可以细化为字符串数组、number数组、boolean数组等等

    // 第一种写法(推荐)
    let arr: number[] = [1,2,3]
    let arr: string[] = ['1','2','3']
    let arr: boolean[] = [false,true]
    // 第二种写法
    let arr: Array<string> = ['1','2','3']
    let arr: Array<number> = [1,2,3]
    .....

// 函数 函数的类型即指的是参数和返回值的类型

    // 方式一:单独指定参数、返回值类型
    function add(num1: number,num2: number): number{
        return num1 + num2
    }
    const add = (num1: number,num2: number): number => {
        return num1 + num2
    }
    // 方式二、同时指定参数和返回值类型(仅适用于函数表达式形式)
    const add: (num1: number,num2: number)=>number = (num1,num2) => {
        return num1 +num2
    }
    // 方式三、当函数没有返回值时,指定类型为void(TS新增类型)
    function greet(name: string):void{
        console.log('欢迎'+name)
    }
    // 方式四、函数参数可选(特别注意的是有多个参数的时候,可选参数一定是最后末尾的参数)
    function mySlice(start?: number,end?: number){
       console.log(start,end)
    } // mySlice() mySlice(1) mySlice(1,2)
    function mySlice(start: number,end?: number){
       console.log(start,end)
    }// mySlice(1,2)  mySlice(1)

// 对象  描述对象属性和方法的类型 tips:单行书写使用分号分隔,换行不需要
    // 方式一
    let person: {name: string;age: number;sayHi(): void;greet(name: string): void} = {
      name:'zs',
      age:18,
      sayHi() {},
      greet(name){}
    }
        // 方式二
    let person: {
      name: string
      age: number
      sayHi:() => void
    } = {
      name:'zs',
      age:18,
      sayHi() {}
    }
    // 方式三 对象属性可选同函数一样,使用问号标识 ?

    let person: {
      name?: string
      age: number
      sayHi:() => void
    } = {
      age:18,
      sayHi() {}
    }

ts新增类型

联合类型、自定义类型(类型别名)、接口、元组、字面量类型、枚举、void、any等

// 联合类型(|)

    let arr: (string | number)[] = [1,'1'] // 有小括号代表数组元素既可以是数字,也可以是字符串
    let arr: string | number[] = [1,2] // 没有小括号代表,只能为字符串数组或者是数字数组

// 自定义类型(类型别名) 关键字 type 作用:可以自定义类型 简化重复书下类型

    let arr1: (string | number)[] = [1,'2']
    let arr2: (string | number)[] = [3,'4']
    // 使用类型别名改造后
    type customArray = (string | number)[]
    let arr1: customArray = [1,'2']
    let arr2: customArray = [3,'4']

// 接口 关键字interface

        //改造前
    let person: {
      name?: string
      age: number
      sayHi:() => void
    } = {
      age:18,
      sayHi() {}
    }
    let person1: {
      name?: string
      age: number
      sayHi:() => void

    } = {
      age:18,
      sayHi() {}
    }
        // 改造后
    interface Iperson {
      name?: string
      age: number
      sayHi:() => void
    }
    let person: Iperson = {
      age:18,
      sayHi() {}
    }
    let person1: Iperson = {
      age:18,
      sayHi() {}
    }
    // tips : 自定义类型type与接口interface是有相似之处,也有不同之处的
    // 相同点:都可以为对象定义类型,简化书写
    // 不同点:接口interface只能为对象定义类型 ,type是可以给任意类型的数据,定义别名类型
    
    // 接口继承 关键字 extends
    interface person {
      name: string,
      age: number
    }
    interface son extends person {
      sex: string
    }

    let son: son= {
      name:'zs',
      age:18,
      sex:'男'
    } // 此处name与age的类型继承于person
    
// 元组  [number,number]明确知道数组有几个元素,并且知道每个元素的类型(示例地图坐标[经度,维度])

    let postion: number[] = [1,2,4,5] 
    let postion: [number,number] = [39.5427,37.123654]
    
// 字面量 

    let str1 = 'hello TS' // str1根据类型推论即为 string
    const str2 = 'hello TS' // str2类型推论类型为 'hello TS'(类比常量)

    // 字面量类型常配合联合类型一起使用,用来表示一组明确的可选值列表
    function changeDirection(direction: 'up' | 'down' | 'left' | 'right') {
      console.log(direction)
    }
    changeDirection('up')
    
 // 枚举  关键字 enum
 
    enum Direction {up,down,left,right}
    function changeDirection(direction: Direction) {
      console.log(direction);
    }
    changeDirection(Direction.up) // 枚举成员是有值的,默认初始为0,自增长的(数字枚举)
    
    enum Direction {up=10,down,left,right}
    function changeDirection(direction: Direction) {
      console.log(direction);
    }
    changeDirection(Direction.up) // 也可以给枚举成员设置值,同样保持自增长
    
    enum Direction {up='up',down='down',left='left',right='right'}
    function changeDirection(direction: Direction) {
      console.log(direction);
    }
    changeDirection(Direction.up) // 字符串枚举 没有自增长的特性,枚举成员必须都设置对应的值
    
    &tips // 字面量加联合类型的方式,跟枚举功能类似的,但是一般推荐使用字面量加联合类型的方式,
    // 因为枚举,在编译为js文件时,同时会被编译成js代码
    
// any 不推荐使用,会使ts失去类型检查

    let obj: any = {x:0}
    obj.y   // 访问对象不存在的属性,没有报错提示
    let a  // 声明变量没有赋值,会隐式具有any类型
    function add(num1,num2) {} // 声明函数,参数不添加类型,也是会隐式具有any类型

类型推论

TS有类型推论的机制,用处:1、在有些情况,是可以省略类型注解的 2、可借助开发工具查看变量类型

  • 声明变量并初始化
let age: number = 18 // 没有省略类型注解
let age = 18  // (推荐) 声明变量并初始化为18,根据类型推论机制age为number类型,省略类型注解

  • 决定函数返回值时
function add(num1: number,num2: number) { // 确定返回值为number类型
    return num1 + num2
}

类型断言

在比TS更明确值的类型时,可以使用类型断言 关键字 as

例如:

// document.getElementById('link')的类型为HTMLelement这个太广泛不能明确link的类型,
// link属性找不到href, 使用类型断言,明确link为HTMLAnchorElement类型,即可以找到a标签特有的href属性

const link = document.getElementById('link') as HTMLAnchorElement 
link.href = '11111'

typeof操作符

js中可以使用typeof操作符查询变量的数据类型,在ts中 typeof操作符可以查询变量的数据类型,也可以在类型上下文中(类型注解的地方)引用变量或属性的类型

console.log(typeof 's') // string
let p = {x: 1,y: 2}
function formatPoint(point: {x: number,y: number}) {}
function formatPoint(point: typeof p) {} // 使用操作符typeof引用变量p的类型,这里等同于 {x: number,y: number}

&tips: typeof只能用来查询变量或者属性得类型,无法查询其他形式的类型(例如:函数的调用类型)