TypeScript 入门 | 青训营笔记

71 阅读3分钟

TypeScript 入门 | 青训营笔记

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

本节课主要是带来 Typescript 的特点、基础语法等分享,同时也介绍到进阶的高级类型及其实例应用,分享要点:

  1. Typescript 基础语法讲解
  2. Typescript 类型
    1. 泛型
    2. 类型别名 & 类型断言
  3. Typescript 高级类型讲解
    1. 联合类型 & 交叉类型
    2. 类型守卫 & 类型保护

基础数据类型

Js: const q = 'string

Ts: const q:string = 'string'

对象数据类型

const bytedancer:IByteDancer = {.....}
interfance IByteDancer{
    readonly jobId : number;
    hobby ?: string;
    name: string;
    [key:string] : any;
}

其中interface关键字是定义类型接口。语法格式为interface IName,以I开头+名字的方式。readonly表示只读,不可以修改,?:表示可选属性,语法[key:类型]:any表示任意类型变量。

函数

interface IMult{
    (x:number,y:number):number;
}
const mult:IMult = (x,y)=>x*y

interface定义类型接口的方式可以避免反复写同样的类型格式。

数组类型

type关键字,其中IArr1、IArr2和接口表示用的比较多

type IArr1 = number[]
type IArr2 = Array<string|number|Record<string,number>>
type IArr3 = [number,number,string,string]
//接口表示,任意类型
interface IArr4{
-   [key:number]:any;
}
const arr1:IArr1=[2,3,3,4]
const arr2:IArr2=[1,3,'3','str',{a:1}]
const arr3:IArr3=[1,2,'3','4']

泛型

当不知道用什么类型,只有在使用的时候才知道数据类型时,此时可以考虑使用泛型。extends表示类型约束

type IGetRepeatArr = <T>(target:T)=>T[]

泛型约束:限制泛型必须符合字符串,表示如下:

type IType = <T extends string>(target:T)=>T[]

泛型参数默认类型,表示如下:

type IType<T=number>=(target:T)=>T[]

  • type表示类型别名,定义了别名类型

  • as关键字表示类型断言

Ts高级类型:联合/交叉类型

type IBookList = Array<{
  author:string;
}&({
  type:'history';
  range:string
})|{
  type:'story';
  theme:string;
}>

联合/交叉类型适合定义两种类型既有重复部分,同时又有自己独立的类型部分的类型定义。&表示交叉部分。

类型保护和类型守卫

类型守卫适合类型无重合点的定义 类型守卫:定义一个函数,它返回一个类型谓词,有效范围为子作用域

interface IA{a:1,a1:2}
interface IB{b:1,b1:2}
function getIsIA (arg:IA|IB):arg is IA{
    return !!(arg aas IA).a;
}

联合类型+类型保护=自动类型判断 keyof关键字:其相当于取值对象中的所有key组成的字符串字面量

type Ikeys = keyof{a:string;b:string}
// 上面的代码等价于下面这句
type Ikeys = "a"|"b"

extends关键字

extends既可以用于类型约束,当extends跟随泛型出现时,表示类型推断,其表达可类比三元表达式,eg:T===判断类型?类型A:类型B infer:类型推断中,表示定义类型变量,用于指代类型。

几种高级类型表示

type IPartial<T extends Record<string,any>>={
  [P in keyof T]?=T[P]
}
type IReturnTpye<T extends (...args:any)=>any> = T extends(...args:any)=> infer R ? R : any

关键字in,相当于取值字符串字面量中的一种可能,配合泛型P,表示每个key

关键字?,通过设定对象可选项,即可自动推导出子集类型