TypeScript | 青训营笔记

41 阅读3分钟

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

一、什么是TypeScript?

TypeScript 是 JavaScript 的类型的超集,它可以编译成纯 JavaScript。编译出来的 JavaScript 可以运行在任何浏览器上。TypeScript 编译工具可以运行在任何服务器和任何系统上。

二、TypeScript和JavaScript的相同点和不同点?

TypeScript和JavaScript都是弱类型语言,不同的是:TypeScript是静态类型,JavaScript是动态类型。

三、TypeScript的优缺点?

(1) 优点

  • 增加了代码的可读性和可维护性
  • 其非常包容
  • TypeScript 拥有活跃的社区

(2) 缺点

  • 有一定的学习难度,需要理解接口(Interfaces)、泛型(Generics)、类(Classes)、枚举类(Enums)等前端工程师可能不是很熟悉的概念
  • 短期可能会增加一些开发成本,毕竟要多写一些类型的定义,不过对于一个需要长期维护的项目,TypeScript 能够减少其维护成本
  • 集成到构建流程需要一些工作量
  • 可能和一些库结合的不是很完美

四、TypeScript基本语法

(1) 基础数据类型

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

(2) 对象类型


const bytedancer: IBytedancer = {

    jobId9303245,

    name'Lin',

    sex'man',

    age28,

    hobby'swimming',

}

interface IBytedancer {

    // 只读属性:约束属性不可在对象初始化外赋值

    readonly jobId: number;

    name: string;

    sex: 'man' | 'woman' | 'other';

    age: number;

    // 可选属性:定义该属性可以不存在

    hobby?: string;

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

    [key: string]: any;

(3) 函数类型

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

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

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

(4) 数组类型

// 「类型+方括号」表示
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 = [1, 2, 3, 4, 5, 6];

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

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

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

(5) 类型别名&类型断言

//通过type关键字定义了I0bjArr的别名类型
type IObjArr = Array<{
    key: string;[objkey: string]: any;
}>
function keyBy<T extends IObjArr>(objArr: Array<T>) {
    // 未指定类型时,result类型为{}
    const result = objArr.reduce((res, val, key) => { res[key] = val; return res; }, {});
    // 通过as关键字,断言result类型为正确类型
    return result as Record<string, T>;
}

五、高级类型

(1) 联合/交叉类型

  • 联合类型:IA|IB;联合类型表示一个值可以是几种类型之一
const bookList = [{
    author'xiaoming',
    type'history',
    range'2001-2021',
}, {
    author'xiaoli',
    type'story',
    theme'love',
}]
  • 交叉类型:IA&IB;多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性
type IBookList = Array<{
    author: string;
} & ({
    type: 'history'; range: string;
} | {
    type: 'story'; theme: string;
})>

(2) 类型保护与类型守卫

interface IA { a: 1, al: 2 }
interface IB { b: 1, b1: 2 }

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

function getIsIA(arg: IA | IB): arg is IA {
    return ! !(arg as IA).a;
}

function log2(arg: IA | IB) {
    if (getIsIA(arg)) {
        console.log(arg.al)
    } else {
        console.log(arg.b1);
    }
}