TypeScript入门 | 青训营笔记

66 阅读3分钟

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

TypeScript入门

基础数据类型

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

对象类型

对象类型会在前面带一个大写I来区别普通的对象,通过interface定义

const bytedancer: IBytedancer = {
    jobId: 999,
    name: 'Jia',
    sex: 'woman',
    age: 22,
    hobby: 'swimming',
}
//定义对象类型
interface IByteancer {
    //只读属性:约束属性不可在对象初始化外赋值(readonly)
    readonly jobId: number;
    name: string;
    sex: 'man' | 'woman' | 'other';
    age: number;
    //可选属性:定义该属性可以不存在
    hobby?: string;
    //容易属性:约束所有对象属性都必须是该属性的子类型
    [key: string]: any;
}

函数类型

类型声明例子:

//1.直接在类型上补充
function add(x: number, y: number): number {
    return x + y;
}
//2.通过定义一个函数类型赋给一个变量,函数类型声明。
const mult: (x: number, y: number) => number = (x, y) => x * y;
//3.通过interface
interface IMult{
    (x: number, y: number): number;
}
const mult: IMult = (x, y) => x * y;

函数重载

对函数进行重载,timestamp为可缺省参数

步骤:

1.定义一个匿名函数,函数自变量,把函数自变量赋值给另一个变量,同时约定变量的类型 2.匿名函数赋值给一个变量,发生类型匹配。

数组类型

  1. 类型+方括号表示 type IArr1 = number[];
  2. 泛型表示 type IArr2 = Array<string | number | Record<string, number>>;
  3. 元组表示 type IArr3 = [number, number, String, string];
  4. 接口表示
interface IArr4{
    [key: number]: any;
}

案例:

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

类型别名&类型断言

1. 类型别名 通过type关键字定义了IObjArr的别名类型

2. 类型断言 未指定类型时,result类型为{}对象,通过as关键字,断言result类型为正确类型。

字符串/数字 字面量

允许指定字符串/数字必须的固定值。 IDomTag必须为html、body、div、span中的一种。

type IDomTag = 'html' | 'body' | 'div' | 'span';

IOddNumber必须为1、3、5、7、9中的一位 type IOddNumber = 1 | 3 | 5 | 7 | 9;

联合/交叉类型

联合类型:IA | IB;联合表示一个值可以是几种类型之一。

交叉类型:IA & IB;多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。

类型保护与类型守卫

类型保护:访问联合类型时,处于程序安全,仅能访问联合类型中的交集部分。

类型守卫:定义一个函数,它的返回值是一个类型谓词,生效范子作用域。

实现函数reverse,可将数组或字符串进行反转,有2中类型保护,typof类型保护和instance类型保护。

联合类型+类型保护=自动类型判断

高级类型

实现merge函数类型,要求sourceObj必须为targetObj的子集。

类型实现繁琐:若obj类型较为复杂,则声明source和target便需要大量重复2遍。

容易出错:若target增加/减少key,则需要source联动去除。

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

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

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

函数返回值类型

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

关键字infer:出现在类型推荐中,表示定义类型变量,可用于代指类型。