TypeScript 泛型程序设计指南

目录

一、泛型程序设计的概念

泛型程序设计是一种程序设计语言风格或范式,它允许开发者在强类型程序设计语言中编写代码时,使用一些未来才指定的类型。这些类型在实例化时作为参数指明,从而提高了代码的灵活性和可重用性。
在 TypeScript 中,泛型允许我们在定义函数、接口或类时,不预先定义具体的类型,而是在使用时指定类型。这种方式避免了代码的重复,并确保了类型安全。

示例:不使用泛型的函数

以下是一个不接受泛型的函数示例,它只能处理 number 类型的参数:

function returnItem(para: number): number {
    
    
    return para;
}

如果需要处理 string 类型,则需要重写函数:

function returnItem(para: string): string {
    
    
    return para;
}

这种方法导致代码重复,且不够灵活。

使用泛型

使用泛型可以解决这个问题:

function returnItem<T>(para: T): T {
    
    
    return para;
}

泛型使得开发者能够创建灵活且可重用的代码。

二、泛型的使用方式

泛型在 TypeScript 中通过 <> 语法使用,可以应用于函数、接口和类的声明。

函数声明

泛型函数的声明方式如下:

function returnItem<T>(para: T): T {
    
    
    return para;
}

可以定义多个类型参数,例如:

function swap<T, U>(tuple: [T, U]): [U, T] {
    
    
    return [tuple[1], tuple[0]];
}
swap([7, 'seven']); // 返回: ['seven', 7]

接口声明

泛型接口的声明方式如下:

interface ReturnItemFn<T> {
    
    
    (para: T): T
}

使用时指定类型:

const returnItem: ReturnItemFn<number> = para => para;

类声明

泛型类可以作用于类本身或类的成员函数:

class Stack<T> {
    
    
    private arr: T[] = [];
    public push(item: T) {
    
    
        this.arr.push(item);
    }
    public pop() {
    
    
        return this.arr.pop();
    }
}

使用方式:

const stack = new Stack<number>();

约束泛型

可以使用 <T extends xx> 来约束泛型:

class Demo<T extends object> {
    
    
    // 类实现
}

索引类型和约束类型

可以使用索引类型和约束类型来实现更复杂的泛型:

function getValue<T extends object, U extends keyof T>(obj: T, key: U) {
    
    
    return obj[key];
}

多类型约束

可以通过继承多个接口来实现多类型约束:

interface FirstInterface {
    
    
    doSomething(): number;
}
interface SecondInterface {
    
    
    doSomethingElse(): string;
}
interface ChildInterface extends FirstInterface, SecondInterface {
    
    }
class Demo<T extends ChildInterface> {
    
    
    private genericProperty: T;
    constructor(genericProperty: T) {
    
    
        this.genericProperty = genericProperty;
    }
    useT() {
    
    
        this.genericProperty.doSomething();
        this.genericProperty.doSomethingElse();
    }
}

三、应用场景

在 TypeScript 中,当需要定义函数、接口或类而不预先定义具体类型时,可以使用泛型。灵活地使用泛型定义类型是掌握 TypeScript 的关键。
通过上述介绍,我们可以看到泛型在提高代码复用性、灵活性和类型安全性方面的重要性。在编写 TypeScript 代码时,合理使用泛型将大大提升开发效率和代码质量。

猜你喜欢

转载自blog.csdn.net/qq_33681891/article/details/142776379