Typescript入门 | 青训营笔记

72 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

基本语法:

基本类型定义

变量名 :类型名称 = 变量值
   
    const q: string = 'Hello World'; // 字符串类型
    const w: number = 1; // 数字
    const e: boolean = false; // 布尔值

对象类型 --- 约定对象名前加一个大写的I来区分自定义对象

   关键字:interface 对象名  
   只读属性:readonly +变量名:属性类型;
   可选属性:变量名?:属性类型
   任意属性:[key: string] :any; 
   
    interface INote {
        readonly Id:number; // 只读属性,约束属性不可在对象初始化外赋值
        name:string;
        age:number;
        hobby?:string; // 可选属性,定义该属性可以不存在
        [key:string]: any; // 任意属性,约束所有对象属性都必须是该属性的子类型
    }

函数类型:

  • 声明函数 interface 函数名称 { (参数名:参数类型,参数名:参数类型):返回值类型}
    interface IAdd {
        (x:number,y:number):number;
    }
    const add: IAdd = (x,y) => x+y; // 计算x+y的值
  • 函数重载
    function getDate(type:'string',timestamp?:string):string; // 对getDate函数进行重载
    
    interface IGetDate {
        (type:'string',timestamp?:string):string,
        (type:'date',timestamp?:string):Date,
        (type:'string' | 'date',timestamp?:string):Date | string
    }

数组类型:

    type IArr1 = number[]; // 类型+方括号表示
    type IArry2 = Array<number>; // 泛型表示
    type IArry3 = [number,number,string,string]; // 元组表示
    interface IArry4 { // 接口表示
        [key:number]:any;
    }

补充

    type IEmptypeFunction = () => void; // 空类型,表示无赋值
    type IAnyType = any; // 任意类型
    enum EnumExample {
        add = '+',
        mult = '*',
    }

泛型 -- 不预先指定具体的类型,而在使用的时候在指定类型的一种特性

    interface IX<T,R> { // 泛型接口
        key : T;
        val : U;
    }
    class IMan<T> { // 泛型类
        instance : T;
    }
    type ITypeArr<T> = Array<T>; // 泛型别名
    
    type IGetStrArr1 = <T extends string>(target: T) => T[]; // 泛型约束:限制泛型必须符合字符串
    type IGetStrArr2<T = number> = (target : T) => T[]; // 泛型默认参数类型

字符串/数字变量 -- 允许指定字符串/数字必须的固定值

    type IStr = 'one' | 'two' | 'three'; //  IStr必须为其中一个

高级类型:

联合/交叉类型:

  • 联合类型:IA | IB; 联合表示一个值可以是几种类型之一
  • 交叉类型:IA & IB; 多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性

类型保护/类型守卫

  • 类型守卫:定义一个函数,它的返回值是一个类型谓词,生效范围为子作用域

    function getIsIA(arg:IA | IB):arg is IA {
        return !! (arg as IA).a;
    }
    function log2 ( arg: IA | IB) {
        if (getIsIA(args)) {
            console.log(arg.a1)
        } else {
            console.log(arg.b1); 
        }
    }

关键字

  • keyof:其相当于取值对象中的所有key组成的字符串字面量,如 type IKeys = keyof {a:string; b:number}; // => type IKeys = "a" | "b"
  • in: 其相当与取值字符串变量中的一种可能,配合泛型P,即表示每个key
  • ? :通过设定对象可选选项,即可自动推导出子集类型
  • extends :跟随泛型出现时,表示类型推断,其表达式可类比三元表达式 如 T === 判断类型?类型A:类型B
  • infer : 出现在类型推断中,表示定义类型变量,可以用于指代类型 如 将函数的返回值类型作为变量,使用新泛型R表示,使用在类型推荐命中的结果中

typescript是javascript的超集,包含于兼容所有js特性,支持共存,支持渐进式引入与升级