• typeScript类型学习



    typeScript,既然是js的超集,更注重在type的判定上,和js的类型也是有差别的。学习记录一下

    1. 字面量

    1.1 什么是字面量

    JavaScript字面量(literal)又称直接量,在JavaScript代码中用来表示一个固定的值,它可以理解为“代码文字表面上的意义的常量”。它是仅表示“自己”意义的一个实例。
    说简单点就是,给变量赋值时,等号右边都可以认为是字面量。

    let a= 1
    let b = '123'
    let c= function fun(){}
    let d = {name:'xh',age:18}
    

    上面的例子中等号右侧的都可以是字面量

    1.2 为什么要有字面量

    启发:借鉴1
    在ts中,你能猜到下面三个变量的类型吗

    const a3 = 100
    var a33 = 200
    let a333  = 'aaa'
    

    结果:

    const a3 = 100  //100
    var a33 = 200   //number
    let a333  = 'aaa' //string
    

    解释下,因为 TS 的类型推断,TS 会把能改变(var 和 let 声明的变量)的变量 companyArea 和 companyPeopleCount 自动推断为合适的类型,const 声明的常量如果赋值为普通类型,因为其永远不会再改变了,则推断为字面量类型。

    1.3 ts中的字面量

    ts中可以直接使用字面量来进行类型说明

    let a3 : 10    //10
    var a4 : 'bingo' //'bingo'
    a3 = 10
    //报错,不能将类型“11”分配给类型“10”
    //a3 = 11
    

    这里有个问题

    const a3 : 10 
    

    会报错,必须初始化 “const” 声明;可能这种写法不行吧,直接改成const a3 = 10

    2.|(联合类型)

    可以搭配字面量使用

    //2.使用 | 来连接多个类型(联合类型)
    let b3 :"male" | "female"
    b3 = "male"
    b3 = "female"
    //报错,不能将类型“123”分配给类型“"male" | "female"”
    //b3 = 123
    
    let c3 : boolean | string
    c3 = true
    c3 = "male"
    //报错,不能将类型“123”分配给类型“string | boolean”
    //c3 = 123
    

    3.any

    //3.any表示的是任意类型,一个变量设置了类型为any后相当于对该变量关闭了TS的类型检测
    //使用TS时,不建议使用any类型
    //let d3 : any
    //声明变量如果不指定类型,则ts解析器会自动将变量的类型判断为any(隐式any)
    //声明赋值后还是any类型
    let d3
    d3 = 123
    d3 = '123'
    d3 = true
    d3 = 444
    

    4.unknown

    //4.unknown表示未知类型的值,声明赋值后还是unknown类型
    let e3 : unknown 
    e3 = 123
    e3 = '123'
    e3 = true
    

    看着和any没有区别哈,下面就是两个的区别了

    5.unknown和any的区别

    let f3 : string 
    let g3 : any
    //d3的类型是any,他可以赋值给任意变量
    f3 = g3
    
    let e3 : unknown
    e3 = "string"
    //5.unknown实际上是一个类型安全的any
    //unknown类型的变量,不能直接赋值给其他的变量
    //报错,不能将类型“unknown”分配给类型“string”
    //f3 = e3
    if(typeof e3 === "string"){
        f3 = e3
    }
    

    6.类型断言

    类型断言主要用于当 TypeScript 推断出来类型并不满足你的需求,你需要手动指定一个类型。

    let e3 : unknown 
    //6.类型断言,可以告诉解析器变量的实际类型
    /*
    语法: 变量 as 类型
    <类型> 变量
    */
    f3 = e3 as string;
    f3 = <string> e3
    
    // 接口
    interface Person{
      name:string;
      age: number
    }
    
    let student = {} as Person
    // let student: Person
    
    student.name = 'jack'
    student.age = 18
    

    断言注意:
    因为 类型断言是在编译时被删除,所以没有与类型断言关联的运行时检查
    如果类型断言失败,则不会出现异常的生成(指的是TypeScript)

    7.void

    //7.void用来表示空,以函数为例,就表示没有返回值的函数(可以没有return,可以直接return;return undefined;return null(但是vscode会报错这里))
    function fun(): void{
       
    }
    

    8.never

    //8.never 表示永远不会返回结果
    function fun2(): never{
        throw new Error('报错了')
    };
    

    9.object

    //9.object表示一个js对象,其实这样的话限制不大
    let a4: object
    a4 = {}
    a4 = function () { }
    a4 = []
    
    
    //{}用来指定对象中包含哪些属性
    //语法:{属性名:类型,属性名:类型}严格的属性个数和类型检测
    let b4: { name: string, age: number }
    //在属性名后面加上?,表示该属性可选可不选
    let c4: { name: string, age?: number }
    c4 = { name: "小花", age: 15 }
    c4 = { name: "小花" }
    //如果只有一个属性是确定的,其他的属性个数和属性名也不确定
    //[propName(名字都行):string]: any(如果属性值全是number改为number,类推) 表示任意类型的属性
    let d4: { name: string, [propName: string]: any }
    d4 = { name: "康康" }
    d4 = { name: "康康", age: 15 }
    d4 = { name: "康康", age: 15, sex: '男' }
    
    /* 
    设置函数结构的类型说明:
    语法:(形参:类型,形参:类型...) => 返回值
    */
    let e4: (a: number, b: number) => number
    e4 = function (n1: number, n2: number): number {
        return n1 + n2;
    }
    

    10.array

    //10.array
    //表示什么类型的数组,语法:类型[] 或则 Array<类型>
    let f4: string[]
    let g4: Array<string>
    f4 = ["a", "b", "c", "d", "e"]
    g4 = ["a", "b", "c", "d"]
    //报错,不能将类型“number”分配给类型“string”
    //f4 = ["a", "b", "c", "d",1]
    // g4 = ["a", "b", "c", 1]
    

    11.元组

    //11.元组,固定长度的数组
    let h4: [string, number]
    h4 = ["a", 2]
    //报错,不能将类型“string”分配给类型“number”
    //h4 = ["a", 'b']
    

    12.enum枚举

    //12.枚举enum
    enum Gender {
        Male = 0,
        Female = 1,
        Other = 2
    }
    let i4: { name: string, gender: Gender }
    i4 = { name: '小王', gender: Gender.Male }
    

    13. &

    //13.&表示同时
    let aaa: string & number  //无意义,类型会是never
    let j4: { name: string } & { age: number }
    

    14.类型的别名

    如果你要反复用到一个类型的话,你可能会这样写

    let k : 1 | 2 | 3 | 4 | 5 | 6
    let m : 1 | 2 | 3 | 4 | 5 | 6
    let n : 1 | 2 | 3 | 4 | 5 | 6
    

    会发现有点呆呆地,你可以用下面的类型别名

    //14.类型的别名
    type myType = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
    let k4 :myType
    k4 = 2
    //报错,不能将类型“10”分配给类型“myType”
    //k4 = 10
    
  • 相关阅读:
    Python基础——简介
    【最详细】最新最全Java基础面试题(52道)
    Qml 实现星级评分组件 已发布
    【数据结构篇】线性表2 —— 栈和队列
    100天精通Oracle-实战系列(第21天)Oracle 数据泵常用参数和命令
    红黑树(1)——为什么要有红黑树
    某网站视频播放花屏解密
    ServletContext、request、response
    Springboot 引入 Redis 并配置序列化和封装RedisTemplate
    图像处理 QImage
  • 原文地址:https://blog.csdn.net/qq_45030898/article/details/127092244