TypeScript 入门 | 青训营笔记

83 阅读3分钟

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

简介

发展历史

  • 2012-10 正式发布(0.8)
  • 2014-10 Angular 支持 TypeScript(2.0版本)
  • 2015-04 微软 发布 Visual Studio Code
  • 2016-05 React 支持 TypeScript(发布 @types/react
  • 2020-09 Vue 支持 TypeScript(3.0版本)

特性

  • 静态类型

    • 可读性增强
    • 可维护性增强
  • 弱类型语言

    • 兼容所有 JS 特性,支持共存
    • 支持渐进式引入和升级
  • JS 超集

编辑器 IDE

  • Visual Studio Code

基本语法

基础数据类型

const str: string = 'string';
const num: number = 1;
const bool: boolean = true;
const nu: null = null;
const udf: undefined = undefined;

对象类型

interface Person {
  // 只读属性
  readonly id: string;
  name: string;
  // 联合类型
  sex: 'male' | 'female' | 'unknown';
  age: number;
  // 可选属性
  hobby?: string;
  // 任意属性
  [key: string]: any;
}
const p: Person = {
  id: '1nahqgeusdhjqjjhqiaeeeee',
  name: 'csy',
  sex: 'male',
  age: 25,
};

函数类型

function add(x: number, y: number): number {
  return x + y;
}
const mul: (x: number, y: number) => number = (x, y) => x * y;
// 缺省参数
function foo(x: number, y?: number) {
  return x + y ?? 0;
}

数组类型

// 数组类型方括号表示
const arr1: number[] = [12, 34];
// 数组泛型表示
const arr2: Array<number | string> = [1, '2'];
// 元组
const arr3: [number, string, boolean] = [12, '3', true];
// 接口表示
const arr4: {
  [key: number]: any;
} = ['1', 5, null, {}, []];

枚举类型

enum Color {
  RED,
  BLUE,
  GREEN,
}

泛型

function print <T> (x: T) {}

interface Print <T> {
  do: (t: T) => void;
}

class PrintClass <T> {
  value: T;
}

// 泛型约束
function print <T extends number> (x: T): void {}
// 泛型参数默认值
function print <T = number> (x: T): void {}

类型别名&类型断言

// 类型别名   type 关键字
type numberArray = Array<number>;

// 类型断言   as 关键字
const c: number = [].findIndex(v => v === 10) as number;

字面量类型

type tag = 'html' | 'head' | 'body';

高级类型

联合类型&交叉类型

type book = string | object;

type Book = { name: string; type: string } & { type: string; author: string };

类型保护&类型守卫

访问联合类型时,出于安全考虑,仅能访问联合类型的交集部分

interface A {
    a: number
    b: number
}
interface B {
    b: number
    c: number
}

// 类型谓词 is 关键字
function getIsA(arg: A | B): arg is A {
  return !!(arg as A).a;
}
function log(arg: A | B) {
  console.log(getIsA(arg) ? arg.a : arg.c);
}

// 类型保护
// 使用 instanceof 关键字 或 typeof 关键字

高级类型

// 关键字 keyof 			取出对象所有 key 构成的字符串字面量联合类型
// 关键字 in    			取出字符串字面量的一种可能
// 关键字 ?     			自动推导子集类型
// 关键字 extends                  表示类型推断
// 关键字 infer    	        定义类型变量,用于指代类型
type Partial <T> = {
  [P in keyof T]?: T[P];
}

type Required <T> = {
  [P in keyof T]-?: T[P];
}

type Readonly <T> = {
  readonly [P in keyof T]: T[P];
}

type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
}

type Record<K extends keyof any, T> = {
  [P in K]: T;
}

type Exclude<T, U> = T extends U ? never : T;

type Extract<T, U> = T extends U ? T : never;

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

type NonNullable<T> = T & {};

type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any> ? P : never;

type ConstructorParameters<T extends abstract new (...args: any) => any> = T extends abstract new (...args: infer P) => any ? P : never;

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : never;

type InstanceType<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R ? R : never;

工程应用

  • webpack

    • 配置 loader ts-loader babel-loader
    • 配置 tsconfig.json
    • 运行 webpack 启动&打包
    • loader 处理 ts 文件时,会进行编译和类型检查
  • tsc

    • typescript 官方编译器
    • npm i typescript -g
    • 全局安装