TypeScript 入门 | 青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
本节课主要是带来 Typescript 的特点、基础语法等分享,同时也介绍到进阶的高级类型及其实例应用,分享要点:
- Typescript 基础语法讲解
- Typescript 类型
- 泛型
- 类型别名 & 类型断言
- Typescript 高级类型讲解
- 联合类型 & 交叉类型
- 类型守卫 & 类型保护
基础数据类型
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
关键字?,通过设定对象可选项,即可自动推导出子集类型