TS — 泛型

泛型(Generics)是 TypeScript 中的一个重要特性,它允许在定义函数、类或接口时使用参数类型的占位符,从而增加代码的灵活性和复用性。

1. 泛型函数

泛型函数允许在函数定义时使用类型参数,这些类型参数可以在函数体内使用,从而使函数可以处理多种类型的数据:

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

let output = identity<string>("hello");  // output 的类型为 string

//<T> 表示这是一个泛型函数,T 是一个类型参数,可以在函数体内使用。函数 identity 接受一个参数 arg,并将它原封不动地返回。

2. 泛型类型

泛型类型允许在定义接口、类等类型时使用类型参数:

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

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

let myIdentity: GenericIdentityFn<number> = identity;

//GenericIdentityFn<T> 是一个泛型接口,定义了一个函数签名,该函数接受一个参数 arg,返回值类型与参数类型相同。然后,我们声明了一个类型为 GenericIdentityFn<number> 的变量 myIdentity,表示该变量是一个接受 number 类型参数的函数。

3. 泛型类

泛型类允许在类的实例成员或静态成员上使用类型参数:

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

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

//GenericNumber<T> 是一个泛型类,它有两个成员:zeroValue 和 add。我们创建了一个 GenericNumber<number> 类型的实例 myGenericNumber,并分别为它的 zeroValue 和 add 成员赋予了适当的值。

4. 泛型约束

泛型约束允许限制泛型类型的范围,使泛型类型必须符合特定条件:

interface Lengthwise {
    length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length);  // 我们知道这个参数有 .length 属性,所以没问题
    return arg;
}

//定义了一个泛型函数 loggingIdentity <T>,并使用了泛型约束 extends Lengthwise,表示泛型类型 T 必须符合 Lengthwise 接口的结构。这样,在函数内部就可以安全地访问 arg 参数的 length 属性。

5. 泛型与默认类型

在 TypeScript 中,可以为泛型参数指定默认类型:

function createArray<T = number>(length: number, value: T): T[] {
    let result: T[] = [];
    for (let i = 0; i < length; i++) {
        result.push(value);
    }
    return result;
}

let arr = createArray(3, 5);  // arr 的类型为 number[]

//reateArray<T = number> 中的 = number 表示 T 的默认类型为 number,如果调用函数时没有明确指定 T 的类型,则默认为 number。泛型是 TypeScript 中非常强大和灵活的特性,它可以帮助开发者编写更加通用和可复用的代码,提高代码的灵活性和可维护性。

 

posted on 2024-04-16 14:29  萬事順意  阅读(26)  评论(0编辑  收藏  举报