乐趣区

关于javascript:现代TypeScript高级教程枚举和泛型

点击在线浏览,体验更好 链接
古代 JavaScript 高级小册 链接
深入浅出 Dart 链接
古代 TypeScript 高级小册 链接

枚举和泛型

接下来咱们将学习 TypeScript 中的两个重要主题:枚举(Enums)和泛型(Generics)。这两个个性能大大提高代码的可重用性和安全性。

枚举

枚举是 TypeScript 中一种非凡的数据类型,容许咱们为一组数值设定敌对的名字。枚举的定义应用 enum 关键字。

enum Direction {
    Up = 1,
    Down,
    Left,
    Right,
}

在这个例子中,咱们定义了一个名为 Direction 的枚举,它有四个成员:UpDownLeftRightUp 的初始值为 1,其余成员的值会主动递增。

除了应用数值,咱们也能够应用字符串:

enum Direction {
    Up = "UP",
    Down = "DOWN",
    Left = "LEFT",
    Right = "RIGHT",
}

此外,TypeScript 还反对计算的和常量成员。常量枚举通过 const enum 进行定义,TypeScript 会在编译阶段进行优化:

const enum Enum {
    A = 1,
    B = A * 2
}

异构枚举

TypeScript 反对数字和字符串混用的枚举,这种类型的枚举被称为异构枚举:

enum BooleanLikeHeterogeneousEnum {
    No = 0,
    Yes = "YES",
}

只管 TypeScript 反对这种用法,但咱们在理论我的项目中应尽可能防止应用异构枚举,因为这会引入不必要的复杂性。

枚举成员的类型

在某些非凡的状况下,枚举成员自身也能够作为一种类型:

enum ShapeKind {
    Circle,
    Square,
}

interface Circle {
    kind: ShapeKind.Circle;
    radius: number;
}

interface Square {
    kind: ShapeKind.Square;
    sideLength: number;
}

泛型

在 TypeScript 中,泛型(Generics)是一种弱小的类型工具,它容许咱们编写可重用、灵便和类型平安的代码。泛型容许咱们在定义函数、类或接口时应用类型参数,这些类型参数在应用时能够被动静地指定具体的类型。

以下是泛型在 TypeScript 中的几个常见利用场景:

1. 函数泛型

函数泛型容许咱们编写可实用于多种类型的函数,进步代码的重用性和灵活性。例如:

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

let result = identity<number>(42);  // result 的类型为 number

在下面的示例中,identity函数承受一个类型参数 T,示意输出和输入的类型。通过在函数调用时显式指定类型参数为number,咱们能够将42 传递给 identity 函数并推断出后果的类型为number

2. 接口泛型

接口泛型容许咱们创立可实用于不同类型的接口定义。例如:

interface Pair<T, U> {
  first: T;
  second: U;
}

let pair: Pair<number, string> = {first: 42, second: "hello"};

在下面的示例中,咱们定义了一个 Pair 接口,它承受两个类型参数 TU,示意 firstsecond属性的类型。通过指定类型参数为 numberstring,咱们创立了一个具体的 pair 对象,它的 first 属性类型为 numbersecond 属性类型为string

3. 类泛型

类泛型容许咱们创立可实用于不同类型的类定义。例如:

class Container<T> {
  private value: T;

  constructor(value: T) {this.value = value;}

  getValue(): T {return this.value;}
}

let container = new Container<number>(42);
let value = container.getValue();  // value 的类型为 number

在下面的示例中,咱们定义了一个 Container 类,它承受一个类型参数 T,示意类的外部值的类型。通过在创立类的实例时显式指定类型参数为number,咱们创立了一个具体的container 对象,它的 value 属性类型为 number,并能够应用getValue 办法获取该值。

泛型还反对束缚(Constraints)的概念,通过应用束缚,咱们能够限度泛型的类型范畴,使其满足特定的条件。

泛型在 TypeScript 中广泛应用于函数、类、接口和类型别名的定义中,它提供了一种灵便、类型平安且可重用的形式来解决不同类型的数据。通过应用泛型,咱们能够在编写代码时提供更弱小的类型反对,从而缩小谬误并进步代码的可维护性和可读性。

退出移动版