TypeScript 泛型

TypeScript 泛型

TypeScript 的泛型(Generics)是一种强大的特性,它允许我们在定义函数、接口或类的时候,不预先指定具体的类型,而是在使用的时候再指定类型。这种特性提高了代码的复用性,同时保持了类型安全和灵活性。

泛型基础

泛型可以用在函数、接口和类中。下面是一个简单的泛型函数示例:

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

在这个例子中,T 代表一个类型变量,它可以在调用函数时被指定为任何类型。例如:

let output = identity<string>("myString");  // output 类型为 'string'
let outputNumber = identity<number>(100);    // outputNumber 类型为 'number'

泛型接口

泛型也可以用于接口,使得接口可以支持多种类型,同时保持接口的结构和类型检查。例如:

interface GenericIdentityFn<T> {
    (arg: T): T;
}

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

let myIdentity: GenericIdentityFn<number> = identity;

在这个例子中,GenericIdentityFn 是一个泛型接口,它定义了一个函数类型,这个函数接受一个类型为 T 的参数,并返回一个类型为 T 的值。

泛型类

泛型类与泛型接口类似,可以在类名后面添加类型变量。例如:

class GenericNumber<T> {
    zeroValue: T;
    add: (x: T, y: T) => T;

    constructor(zeroValue: T, add: (x: T, y: T) => T) {
        this.zeroValue = zeroValue;
        this.add = add;
    }
}

let myGenericNumber = new GenericNumber<number>(0, (x, y) => x + y);

在这个例子中,GenericNumber 是一个泛型类,它有一个属性 zeroValue 和一个方法 add,它们都使用了类型变量 T

泛型约束

有时候,我们可能希望限制泛型类型的范围,这时可以使用泛型约束。例如,我们希望泛型 T 必须有 length 属性,可以这样定义:

interface Lengthwise {
    length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length);  // Now we know it has a .length property, so no more error
    return arg;
}

在这个例子中,T 被约束为必须实现 Lengthwise 接口,这意味着它必须有一个 length 属性。

总结

TypeScript 的泛型提供了强大的类型抽象能力,使得开发者可以编写更加灵活和可重用的代码。通过泛型,我们可以创建适用于多种类型的数据结构和方法,同时保持类型安全和清晰的代码结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>