TypeScript入门笔记 | 青训营笔记

72 阅读3分钟

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

TypeScript入门笔记

TypeScript与JavaScript相比,TypeScript是静态类型,JavaScript是动态类型。

基本语法

基础数据类型

字符串:

const q: string = 'string';

数字:

const w:number = 1;

布尔值:

const e:boolean = true;

null:

const r:null=null;

undefined:

const t:undefined = undefined;

对象类型

在对象类型前加个“I”,用于区分类型和对象名,例如:

const byedancer:IBytedance = {}

用interface声明定义对象,例如:

interface IBytedance{}

其中,readonly 表示只读属性,约束属性不可在对象初始化外赋值。除此之外还有:

可选属性:定义该属性可以不存在(在“:”前加“?”)

hobby?:string;

任意属性:约束所有对象属性都必须是该属性的子类型

[key:string]:any;

函数类型

在变量后面加“:类型”,如:

function add(x: number, y: number): number {
return x + y;
}

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

//也有声明定义那种方法,如下:

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

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

函数重载

image.png

数组类型

数组有三种表示方式:

一、类型+“[]”表示

例:

type IArr1 = number[];

const arr1:IArr1 = [1,2,3,4,5,6];

二、泛型表示

type IArr2 = Array<string | number | Record<string,number>>;

const arr2 = IArr2 = [1,2,'3','4',{a;1}];

三、元祖表示

type IArr3 = [number,number,string,string];

const arr3:IArr3 = [1,2,'3','4'];

四、接口(interface)表示

interface IArr4{
[key:number]:any;
}

const arr4:IArr4 = ['string',() => null,{},[]];

补充类型

空类型

表示无赋值

type IEmptyFunction = () => void;

任意类型

是所有类型的子类型

type IAnyType = any;

枚举类型

支持枚举值枚举名的正、反向映射 (两个功能相互调换)

enum EnumiExample {
add = '+',
mult = '*',
}

EnumiExample['add'] === '+';
EnumiExample['+'] === 'add';

enum ECorlor {Mon,Tue,Wed,Thu,Fri,Sat,Sun};
ECorlor['Mom'] === 0;
ECorlor[0] === 'Mon';

泛型

type INumArr = Array<number>;

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

type IGetRepeatArrR = <T>(target:T) =>T[];

泛型接口&多泛型

interface IX<T,U>{
key:T;
val:U;
}

泛型类:

    class IMan<T>{
    instance:T;
    }

泛型别名

type ITypeArr<T> = Array<T>;

一些示例:

image.png

类型别名&类型断言

关键字type:通过type关键字定义别名类型。

关键字as:通过as关键字,断言类型为正确类型。

例:

image.png

字符串/数字 字面量

image.png

高级类型

联合/交叉类型

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

例如:

image.png

类型保护与类型守卫

  • 类型保护又叫类型守卫,是为了提高程序的鲁棒性存在的。
  • 类型守卫 : 定义一个函数,它的返回值是一个类型谓词,生效范围为子作用域。

其它关键字

keyof:索引类型,其相当于取值对象中的所有key组成的字符串字面量,如

type IKeys = keyof{ a: string; b: number };
// => type IKeys = "a " | "b"

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

”:通过设定对象可选选项,即可自动推导出子集类型。

extends:跟随泛型出现时,表示类型推断,其表达可类比三元表达式,如

T===判断类型?类型A:类型B

infer:出现在类型推荐中,表示定义类型变量,可以用于指代类型。如该场景下,将函数的返回值类型作为变量,使用新泛型R表示,使用在类型推荐命中的结果中。