typescript的高阶用法


记录和学习一些常用或需要了解的用法,下面是一些 TypeScript 的高级用法及其示例:

1. 泛型 (Generics)

泛型允许你定义函数、类或接口时,不指定具体的类型,而是使用类型参数。这样可以使代码更加灵活和可重用。

function identity<T>(arg: T): T {
  return arg;
}

let output1 = identity<string>("Hello TypeScript");
let output2 = identity<number>(42);

2. 交叉类型 (Intersection Types)

交叉类型用于将多个类型合并为一个类型,表示一个对象可以同时拥有这些类型的所有成员。

interface Person {
  name: string;
}

interface Employee {
  employeeId: number;
}

type EmployeePerson = Person & Employee;

let employee: EmployeePerson = {
  name: "John",
  employeeId: 1234,
};

3. 联合类型 (Union Types)

联合类型允许一个值可以是几种类型之一。

function format(input: string | number): string {
  if (typeof input === "string") {
    return input.toUpperCase();
  } else {
    return input.toFixed(2);
  }
}

4. 类型守卫 (Type Guards)

类型守卫用于在运行时判断变量的类型,从而在代码中使用特定类型的方法和属性。

function isString(value: any): value is string {
  return typeof value === "string";
}

function example(input: string | number) {
  if (isString(input)) {
    console.log(input.toUpperCase());
  } else {
    console.log(input.toFixed(2));
  }
}

5. 映射类型 (Mapped Types)

映射类型允许你基于已有类型创建新类型,常用于转换对象属性的类型。

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

interface Person {
  name: string;
  age: number;
}

type ReadOnlyPerson = ReadOnly<Person>;

let person: ReadOnlyPerson = { name: "Alice", age: 30 };
// person.age = 31; // Error: Cannot assign to 'age' because it is a read-only property.

6. 条件类型 (Conditional Types)

条件类型根据条件表达式选择一种类型。

type TypeName<T> = T extends string
  ? "string"
  : T extends number
  ? "number"
  : T extends boolean
  ? "boolean"
  : "object";

type T0 = TypeName<string>; // "string"
type T1 = TypeName<number>; // "number"
type T2 = TypeName<boolean>; // "boolean"
type T3 = TypeName<object>; // "object"

7. 高级类型推断

TypeScript 的类型推断能力非常强大,可以根据上下文自动推断出复杂类型。

function makeTuple<T, U>(first: T, second: U) {
  return [first, second] as [T, U];
}

let tuple = makeTuple("hello", 42); // [string, number]

8. 模板字面量类型 (Template Literal Types)

模板字面量类型允许通过模板字符串创建类型。

type Color = "red" | "green" | "blue";
type Brightness = "light" | "dark";

type Theme = `${Color}-${Brightness}`;

let theme: Theme;
theme = "red-light"; // valid
theme = "blue-dark"; // valid
// theme = "yellow-light"; // Error

9. 索引类型和查找类型

索引类型用于访问另一种类型的属性。

interface Person {
  name: string;
  age: number;
}

type PersonName = Person["name"]; // string
type PersonProperties = keyof Person; // "name" | "age"

10. Utility Types

TypeScript 提供了一些内置的实用类型,可以简化常见的类型操作。

interface Person {
  name: string;
  age: number;
  address: string;
}

// Partial: 将所有属性设为可选
type PartialPerson = Partial<Person>;

// Required: 将所有属性设为必需
type RequiredPerson = Required<Person>;

// Readonly: 将所有属性设为只读
type ReadonlyPerson = Readonly<Person>;

// Pick: 选择特定属性
type PersonNameAndAge = Pick<Person, "name" | "age">;

这些高级用法使得 TypeScript 能够表达更复杂的类型逻辑,增强类型检查的能力,从而提高代码的安全性和可维护性。


文章作者: fullsize
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fullsize !
  目录