笔记4|青训营

66 阅读3分钟

笔记4|青训营

当在TypeScript中使用类和泛型时,可以通过以下步骤来实践并探讨其使用方法和场景,以及如何使用类型约束来增加代码的灵活性和安全性。

步骤1:创建通用类

首先,你可以创建一个通用类,其中使用了泛型来使其适用于多种数据类型。一个常见的示例是实现一个通用的容器类,比如堆栈、队列等。

class Stack<T> {
    private items: T[] = [];

    push(item: T): void {
        this.items.push(item);
    }

    pop(): T | undefined {
        return this.items.pop();
    }
}

// 使用示例
const numberStack = new Stack<number>();
numberStack.push(10);
numberStack.push(20);
console.log(numberStack.pop()); // Output: 20

const stringStack = new Stack<string>();
stringStack.push("Hello");
stringStack.push("World");
console.log(stringStack.pop()); // Output: "World"

步骤2:使用泛型函数

你还可以在类外部编写泛型函数,用于处理不同类型的数据。

function reverse<T>(array: T[]): T[] {
    return array.reverse();
}

const numbers = [1, 2, 3, 4, 5];
const reversedNumbers = reverse(numbers);
console.log(reversedNumbers); // Output: [5, 4, 3, 2, 1]

步骤3:使用类型约束

类型约束允许你指定泛型必须满足的条件,从而增加代码的灵活性和安全性。例如,你可以使用类型约束来确保泛型参数具有特定的属性或实现了特定的接口。

interface Printable {
    print(): void;
}

class PrintQueue<T extends Printable> {
    private queue: T[] = [];

    enqueue(item: T): void {
        this.queue.push(item);
    }

    printAll(): void {
        this.queue.forEach(item => item.print());
    }
}

class Document implements Printable {
    constructor(private name: string) {}

    print(): void {
        console.log(`Printing document: ${this.name}`);
    }
}

const queue = new PrintQueue<Document>();
queue.enqueue(new Document("Report"));
queue.enqueue(new Document("Invoice"));
queue.printAll();

步骤4:使用泛型继承

你还可以在类继承中使用泛型。例如,你可以创建一个通用的存储库类,可以与不同的数据模型一起使用。

class Repository<T> {
    private items: T[] = [];

    add(item: T): void {
        this.items.push(item);
    }

    getAll(): T[] {
        return this.items;
    }
}

interface User {
    id: number;
    name: string;
}

const userRepository = new Repository<User>();
userRepository.add({ id: 1, name: "Alice" });
userRepository.add({ id: 2, name: "Bob" });
const allUsers = userRepository.getAll();
console.log(allUsers);

泛型类的使用场景:

  1. 数据结构封装: 如果你想在类中封装一种数据结构,例如栈、队列等,使用泛型可以让你在封装通用操作时保持类型安全。
  2. 容器类: 当你需要创建一个可以容纳不同类型元素的容器类时,例如数组、集合等,泛型类可以帮助你实现类型安全的数据存储和检索。
  3. 异步操作封装: 如果你需要在类中封装异步操作,例如 Promise,可以使用泛型来表示异步操作返回的数据类型。
  4. 工具类: 泛型类还适用于创建通用的工具类,这些工具类可以在不同的场景中使用,并且能够适应不同的数据类型。

类型约束的使用场景:

  1. 限制类型范围: 通过类型约束,你可以限制泛型类型参数只能是特定的类型或特定类型范围内的子类型。
  2. 操作特定属性或方法: 使用类型约束可以确保你在泛型类中只能操作特定属性或方法。
  3. 保障代码安全性: 类型约束可以在编译时捕获类型错误,避免在运行时出现意外的类型问题。

总结

在这个示例中,我们定义了一个名为Printable的接口,要求对象具有print方法。然后,在StackWithConstraint类中,我们使用了泛型类型约束T extends Printable,这意味着堆栈只能存储实现了Printable接口的对象。这样可以确保我们只能将具有print方法的对象推入堆栈,从而增加了代码的安全性和灵活性。

TypeScript中的类和泛型为编写通用、可维护的代码提供了强大的工具。通过使用泛型,你可以在不同数据类型之间共享代码逻辑,并增加代码的可重用性。通过使用类型约束,你可以提高代码的灵活性和类型安全性,确保泛型参数满足特定的条件。在设计和构建应用程序时,合理利用泛型和类可以大大提升代码的质量和可维护性。

ps.求各位大佬轻点喷[膜拜]