TypeScript 高级泛型解释及示例

TypeScript 中的泛型提供了一种通过使用多种数据类型来创建可重用且灵活的代码组件的方法。高级泛型通过引入约束、默认值和多种类型等附加功能进一步扩展了这一概念,使开发人员能够编写更强大且类型安全的代码。在本文中,将使用示例来探索泛型中的这些高级概念。

通用约束

约束限制了泛型可以接受的类型。这可确保传递给泛型函数或类的类型符合某些条件。例如,可以使用约束来确保泛型类型具有特定的属性或方法。

function getLength<T extends { length: number }>(arg: T): number {
    return arg.length;
}

const stringLength = getLength("TypeScript");
const arrayLength = getLength([1, 2, 3]);

在此示例中,<T extends { length: number }> 约束确保传递给 getLength 的参数具有 length 属性。

多个泛型

TypeScript 允许在同一个函数、类或接口中使用多种泛型类型。这在处理涉及多种类型的值对或其他数据结构时非常有用。

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

const stringNumberPair = pair("TypeScript", 2024);

此函数 pair 接受两种不同的泛型类型 TU,并返回包含两种类型的元组。

默认泛型类型

TypeScript 中的泛型也可以具有默认类型。如果您希望泛型在未提供特定类型的情况下具有后备类型,则这很有用。

function identity<T = string>(value: T): T {
    return value;
}

const defaultString = identity("Hello");  // T is string
const customNumber = identity<number>(100);  // T is number

在这个例子中,如果没有向 identity 传递类型,则它默认为 string

将泛型与接口结合使用

泛型可以与接口一起使用,以定义类型不固定的复杂结构。这增加了数据管理方式的灵活性。

interface Container<T> {
    value: T;
}

const stringContainer: Container<string> = { value: "Hello" };
const numberContainer: Container<number> = { value: 42 };

Container 接口旨在保存任何类型的值,允许具有特定类型的不同类型的容器。

泛型类

TypeScript 中的类也可以是泛型的。这在设计使用各种数据类型的类(例如数据存储或集合类)时特别有用。

class DataStore<T> {
    private data: T[] = [];

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

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

const stringStore = new DataStore<string>();
stringStore.add("Hello");
stringStore.add("TypeScript");

const numberStore = new DataStore<number>();
numberStore.add(42);

在此示例中,DataStore 类可以处理任何类型的数据,提供一种类型安全的方式来存储和检索元素。

结论

TypeScript 中的高级泛型是编写灵活、可重用且类型安全的代码的强大工具。通过在类和接口中使用约束、多种类型、默认值和泛型,开发人员可以编写更复杂、更强大的代码。理解和利用这些高级概念可以提高灵活性并确保跨应用程序的类型安全。