[ React | 青训营笔记 ]

64 阅读2分钟

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

TypeScript的发展与基本语法

01.为什么是TyepScript

历史发展:
2016-05,TypeScript可开发React
2020-09,Vue发布了3.0版本,官方支持TypeScript

TS是静态类型语言、弱类型语言
静态类型:提前进行类型的匹配
动态类型:执行阶段确定类型的匹配,JS是动态类型
弱类型语言:隐式类型转换

静态类型的特点:

  • 可读性增强:基于语法解析TSDoc,ide增强
  • 可维护性增强:在编译阶段暴露大部分错误
  • 多人合作的大型项目中,获得更好的稳定性和开发效率

JS的超集

  • 包含于兼容所有JS特性,支持共存
  • 支持渐进引入与升级

02.基本语法

基本数据类型

字符串
const q: string = 'stirng';
数字
const w: number = 1;
布尔值
const e: boolean = true;
null
const r: null = null;
undefined
const t: undefined = undefined;

对象类型

自定义类型:interface 类型名称
any:所有类型

const bytedancer: Ibytedancer = {
    jobId: 123123,
    name: 'Ling',
    sex: 'man',
    age: 28,
    hobby: 'swimming'
}

interface IBytedancer {
    //只读属性:约束属性不可在对象初始化外赋值
    readonly jobId: number;
    name: string;
    sex: 'man' | 'woman' | 'other';
    age: number;
    //可选属性:定义该属性可以不存在
    hobby?: string;
    //任意属性:约束所有对象属性都必须是该属性的子类型
    [key: string]: any;
}

函数类型

写法一:

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

写法二:

function add(x: number, y: number): number{
    return x + y;
}
const mult: (x: number, y: number) => number = (x,y) => x * y;

数组类型

//type + 方括号 表示
type IArr1 = number[];
//泛型类型
tpe IArr2 = Array < string | number | Record<string, number>>;
//元组表示
type IArr3 = [number, number, string, string];
//接口表示
interface Iarr4 {
    [key: number]: any;
}

const arr1: IArr1 = [1,2,3,4,5,6];
const arr2: IArr2 = [1,2,'3','4',{a: 1}];
const arr3: IArr3 = [1,2,'3','4']'
const arr4: IArr4 = ['string', () => null, {}, []];

TypeScript高级数据类型

03.高级类型

联合/交叉类型

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

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

高级类型

interface IMerge{
    <T extends Record<string, any>>(sourceObj: Partial<T>, targetObj: T): T;
}
type IPartial<T extends Record<string, any>> = {
    [P in keyof T]?: T[P];
}
//索引类型:关键字【keyof】,其相当于取值对象中的所有key组成的字符串字面量,如
type IKeys = keyof {a: sring; b: number};   // ==> type IKeys = "a" | "b"
//关键字【in】,其相当于取址 字符串字面量中的一种可能,配合泛型P,即表示每个key
//关键字【?】,通过设定对象可选选项,即可自动推导出子集类型