ts入门 | 青训营笔记

90 阅读2分钟

这是我参与「第四届青训营」笔记创作活动的的第8天

为什么

  • 静态类型+弱类型
  • 动态类型:执行时匹配类型
  • 静态类型:提前(编译时)匹配类型
  • 弱类型:执行时类型可以转换
  • 可读可维护,包含与兼容所有Js特性,支持渐进式引入和升级

基本语法

基础数据类型

  • 通过var x : type = data定义
  • string、number、boolean、null、undefined

对象数据类型

  • var obj : type = {xxx}

函数

  • function add(x:number,y:number):number{xxx};

  • function add(x:number,y:number)=>number{xxx};

  • interface IMult{

    ​ (x:number,y:number):number;

    }

    const mult :Imult = (x,y)=>x*y;

  • 函数可以重载(同名不同参)

数组

  • type IArr1 = number[];
  • type IArr2 = Array<string|number>
  • type IArr3 = [number,number]//元组

其他类型

  • any任意
  • void空
  • enum枚举类型,支持正反映射
  • 泛型

泛型

  • 不预先指定具体类型,使用时再指定

  • 数组Array< T >

  • class iMan< T >{

    ​ instance T

    }

  • < T extends string >限制泛型必须符合字符串

  • < T = number >指定默认类型

别名和断言

  • type xxx = Array<{

    ​ key:string,

    ​ [objkey:string]:any

    }>

    用xxx指代类型

  • 通过as关键字断言结果是正确的类型以此通过编译

字面量

​ 使用|指定固定取值

  • var x = 1|2|3,只能取1,2,3

高级类型

联合交叉类型

type IBookList = Array<{
    author:string;
} &({
    type:"history";
    range:string;
}|{
	type:"story";
    theme:string;
})>
//A|B表示值是几种类型之一
//A&B表示多种类型堆叠到一起

类型保护与守卫

function getISIA(arg:IA|IB):arg is IA{
    return !!(arg as IA).a
}
  • 返回一个类型谓词,生效于子作用域

  • 当然也可以通过typeof或instanceof来进行保护和守卫

高级类型

type IPartial<T extends Record<string,any>> = {
    [P in keyof T]?:T[P]
}
type IKey =keyof {a:string;b:number}
  • 关键字keyof返回对象中key组成的字符串字面量
  • in相当于取值字符串字面量中的一种可能,配合泛型则表示每个key
  • ?表示可选
type IDelayCall = <T extends ()=>any>(func:T)=>ReturnType<T>;

type IReturnType<T extends (...args:any)=>any> = T extends (...args:any)=>infer R ? R:any
  • extends 跟随泛型出现表示类型推断(匹配),可类比为三元表达式
  • T === 判断类型?类型A:类型B
  • infer出现在类型推断中,表示定义类型变量,可用于指代类型
  • 本例中意思是如果命中T就是命中的R,否则是any

关于TS,我的想法

  • ts本身是为了约束规范而出现的
  • 如果用的好,TS就是个很好地工具
  • 然而再好的约束也应该有良好的编程习惯作为辅助,否则ts只会阻碍编码