Jupyter AI

23 泛型的使用 🌐之泛型与接口

📅 发表日期: 2024年9月14日

分类: 🟦TypeScript 入门

👁️阅读: --

在前一章中,我们探讨了如何定义泛型函数,这为我们使用泛型奠定了基础。在这一章节中,我们将深入了解 泛型接口 之间的关系,以及如何在接口中使用泛型来提高代码的灵活性与可重用性。

泛型接口的定义

泛型接口允许我们在定义接口时不指定具体的类型,而是使用类型参数。这样,接口就可以在实现时为特定的数据类型提供灵活性。

定义泛型接口

我们可以像下面这样定义一个泛型接口:

interface Pair<K, V> {
    key: K;
    value: V;
}

在这个例子中,Pair 接口有两个类型参数 KV,代表键和值的类型。

实现泛型接口

实现泛型接口时,我们可以使用特定的类型参数。例如,我们可以创建一个 numberstring 类型的键值对:

const numberStringPair: Pair<number, string> = {
    key: 1,
    value: "one"
};

console.log(numberStringPair); // { key: 1, value: "one" }

同样,我们也可以创建不同类型的键值对:

const stringBooleanPair: Pair<string, boolean> = {
    key: "isActive",
    value: true
};

console.log(stringBooleanPair); // { key: "isActive", value: true }

使用泛型约束

在某些情况下,我们希望确保类型参数满足某些特定的条件,这可以使用 泛型约束 来实现。我们可以通过 extends 关键字来指定类型约束。

定义带约束的泛型接口

例如,我们可以定义一个新的接口,使得 K 必须是 string 类型,而 V 可以是任意类型:

interface StringKeyedPair<V> {
    key: string;
    value: V;
}

实现带约束的接口

现在,我们可以实现 StringKeyedPair 接口,使用 boolean 类型作为值:

const booleanPair: StringKeyedPair<boolean> = {
    key: "isActive",
    value: true
};

console.log(booleanPair); // { key: "isActive", value: true }

泛型接口的应用场景

  1. 数据结构:在实现栈、队列等数据结构时,使用泛型接口可以使得数据结构支持多种类型。

  2. API 响应:在处理不同类型的 API 响应时,可以使用泛型接口来描述可能的返回数据类型。

示例:使用泛型接口实现栈

以下是一个使用泛型接口实现简单栈的例子:

interface Stack<T> {
    push(item: T): void;
    pop(): T | undefined;
    isEmpty(): boolean;
}

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

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

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

    isEmpty(): boolean {
        return this.items.length === 0;
    }
}

// 使用泛型接口
const numberStack = new ArrayStack<number>();
numberStack.push(1);
numberStack.push(2);
console.log(numberStack.pop()); // 2

const stringStack = new ArrayStack<string>();
stringStack.push("Hello");
console.log(stringStack.pop()); // "Hello"

在这个例子中,我们定义了一个泛型接口 Stack 和它的一个实现 ArrayStack。通过使用泛型,我们可以创建支持 numberstring 的栈实例,而不需要重复代码。

结论

在本章中,我们深入探讨了 泛型与接口 的作用和应用。使用泛型接口可以提高我们代码的灵活性和可重用性,让我们能够处理多种类型的数据。在实际开发中,了解并善用泛型接口是非常重要的。

接下来,我们将进一步探讨 使用泛型类,这将帮助我们了解如何在类中引入泛型,并提高类的通用性。

🟦TypeScript 入门 (滚动鼠标查看)