Skip to content

TypeScript

基础类型

  • Boolean
  • Number
  • String
  • Array
  • Enum
  • Any:与any同为顶级类型
  • Unknown
  • tuple:元组类型,必须提供到其中到每一个参数
  • Void
  • Null & undefined

TIP

是所有类型的子类型, 可以把 nullundefined 赋值给 number 类型的变量,如果你指定了--strictNullChecks 标记,nullundefined 只能赋值给 void 和它们各自的类型

  • Never

TIP

never 类型表示的是那些永不存在的值的类型。 例如,never 类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型。利用never特性来实现全面性检查。

js
type Foo = string | number;

function controlFlowAnalysisWithNever(foo: Foo) {
 if (typeof foo === "string") {
  // 这里 foo 被收窄为 string 类型
 } else if (typeof foo === "number") {
  // 这里 foo 被收窄为 number 类型
 } else {
  // foo 在这里是 never
  const check: never = foo;
 }
}

类型断言

  • a<string> 语法
js
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
  • xxx as string 语法
js
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;

类型守卫

类型保护是可执行运行时检查的一种表达式,用于确保该类型在一定的范围内。

  • in
js
interface Admin {
 name: string
 options: string[]
}

interface Employee {
 name: string
 startDate: Date
}

type UnknownEmployee = Employee | Admin;

function printEmployeeInfo(emp: UnknownEmployee) {
 console.log("Name: " + emp.name)
 if ("options" in emp) {
  console.log('emp' is 'Admin')
 }
 if ("startDate" in emp) {
  console.log('emp' is 'Employee')
 }
}
  • typeof
js
typeof v === typeName
typeof v !== typeName

typeName 只支持 number string boolean symbol
  • instanceof
js
interface I {
 getPaddingString(): string;
}

class A implements I {
  constructor(private numSpaces: number) {}
  getPaddingString() {
   return Array(this.numSpaces + 1).join(" ");
  }
}

class B implements I {
  constructor(private value: string) {}
  getPaddingString() {
    return this.value;
  }
}

let C: A = new A(6);
if (C instanceof A) {
  // C的类型收窄为 'A'
}

A类,B类实现接口I。C通过A类构造,C instanceof A 为true
  • 自定义类型保护
js
function isNumber(x: any): x is number {
  return typeof x === 'number'
}
function isString(x: any): x is string {
  return typeof x === 'string'
}

联合类型和类型别名

联合类型

js
function a(name: string | undefined) {

}

可辨识联合

js

1. 可辨识
enum CarTransmission {
 Automatic = 200,
 Manual = 300
}

interface Motorcycle {
 vType: "motorcycle"; // discriminant
 make: number; // year
}

interface Car {
 vType: "car"; // discriminant
 transmission: CarTransmission
}

interface Truck {
 vType: "truck"; // discriminant
 capacity: number; // in tons
}

2. 联合类型

type Vehicle = Motorcycle | Car | Truck;

类型别名

js
type Message = string | string[];
let greet = (message: Message) => {
  // ...
};

交叉类型

将多个类型合并为一个类型。 这可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。

ts
interface IPerson {
 id: string;
 age: number;
}

interface IWorker {
 companyId: string;
}

type IStaff = IPerson & IWorker;

const staff: IStaff = {
 id: 'E1006',
 age: 33,
 companyId: 'EFT'
};

工具类型的实现

ts
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;

any, unknow, never,void

  • any:用于描述任意的类型
  • unknow:表示未知类型的值的类型
  • never:表示一个永远不会出现的值的类型
  • void:表示没有返回值的函数的返回类型

Released under the MIT License.