深入浅出 TypeScript 泛型

TypeScript 的泛型是其最强大的特性之一,但如何理解这些概念呢?今天,我们要谈论的是在函数、类和接口中如何使用泛型来增加代码的灵活性和复用性。

1. 函数泛型

TypeScript 支持函数泛型,即可以将一个函数的参数类型指定为一组类型,而不是固定的类型。

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

在这个例子中,T 是一个占位符,它代表任何类型。我们可以传入任意类型的值给 identity 函数,然后得到相同类型的结果。

2. 类泛型

TypeScript 也支持类泛型,即可以将一个类的属性和方法指定为一组类型,而不是固定的类型。

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

    push(element: T): void {
        this.elements.push(element);
    }

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

在这个例子中,T 是一个占位符,它代表任何类型。我们可以创建一个 Stack 类来存储任意类型的元素。

3. 接口泛型

TypeScript 支持接口泛型,即可以将一个接口的属性和方法指定为一组类型,而不是固定的类型。

interface Container<T> {
    value: T;
}

class Person implements Container<string> {
    value: string;

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

在这个例子中,T 是一个占位符,它代表任何类型。我们可以创建一个 Person 类来实现一个 Container 接口,这个接口指定了 value 属性的类型为 string。

4. 泛型约束

TypeScript 支持泛型约束,即可以对泛型类型施加额外的限制。

function identity<T extends string | number>(arg: T): T {
    return arg;
}

在这个例子中,T 是一个占位符,它代表任何类型,但必须是 string 或 number 之一。

5. 泛型继承

TypeScript 支持泛型继承,即可以从父类或父接口中继承泛型类型。

class Animal<T> {
    name: T;

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

class Dog extends Animal<string> {
    breed: string;

    constructor(breed: string) {
        super(breed);
    }
}

在这个例子中,Dog 类从 Animal 类继承泛型类型 T,并指定了它的值为 string。

总之,通过本文,我们应该能够理解 TypeScript 中泛型的各种特性和应用。


来源: 互联网
本文观点不代表源码解析立场,不承担法律责任,文章及观点也不构成任何投资意见。

赞 ()

相关推荐

发表回复

评论列表

点击查看更多

    联系我们

    在线咨询: QQ交谈

    微信:13450247865

    邮件:451255340#qq.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    微信