TypeScript类、泛型使用实践记录 | 青训营

76 阅读3分钟

前言

TypeScript是JavaScript的一个超集,它添加了静态类型和其他功能,以提供更好的开发体验和更好的代码质量。其中,泛型是TypeScript的一个强大功能,它允许我们创建可重用的代码,适用于任何数据类型。

泛型的基本使用

在TypeScript中,泛型最常用于创建通用的函数和类。泛型是 TypeScript 中的一种特性,允许您编写适用于多种数据类型的通用代码。在函数中,您可以使用 <T> 来表示泛型参数,使函数能够处理不同类型的输入数据。例如,函数 function identity<T>(value: T): T 可以接受任意类型的参数,并返回相同的类型值。类泛型可以使类实例存储不同类型的数据,增强了代码的复用性。另外,通过约束泛型,您可以限制它适用的类型范围,确保输入满足特定条件。泛型让您的代码更具灵活性和类型安全性,适用于函数、类、接口等多种场景,提高了代码的可维护性和可读性。

泛型函数

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

在这个例子中,<T>定义了一个名为T的泛型类型。这个函数可以接受任何类型的参数,并返回相同类型的参数。

泛型类

泛型类是 TypeScript 中的一种特性,它允许您创建具有通用性的类,可以在多种数据类型上工作。通过使用泛型参数,您可以在类定义中引入一个或多个类型参数,从而实现类的通用性。以下是泛型类的说明:

class Box<T> {  
    content: T;  
      
    constructor(content: T) {  
        this.content = content;  
    }  
      
    get(): T {  
        return this.content;  
    }  
}  
  
let box = new Box(10); // T is inferred as number  
console.log(box.get()); // Returns 10

在这个例子中,Box是一个泛型类,它有一个类型为T的属性content。当我们创建一个Box的实例时,TypeScript会自动推断T的类型。

泛型约束

有时,我们可能希望对泛型的类型进行一些限制。这可以通过使用类型约束来实现。 泛型约束是 TypeScript 中用于限制泛型类型参数的一种技术,它允许您指定泛型必须满足的条件。通过泛型约束,您可以确保泛型在使用时具有特定的属性、方法或行为,从而提高代码的类型安全性和可靠性。以下是泛型约束的说明:

class Box<T extends number> { // T is constrained to number type  
    content: T;  
      
    constructor(content: T) {  
        this.content = content;  
    }  
      
    get(): T {  
        return this.content;  
    }  
}  
  
let box = new Box(10); // T is now known to be a number

在这个例子中,T extends number是一个类型约束,意味着T必须是number或者是number的子类型。

泛型与接口

在TypeScript中,我们还可以使用泛型和接口来创建一个能够接受任何类型的,但仍保持类型安全的数据结构。

interface StringMap<T> {  
    [key: string]: T;   
    length: number;   
}  
  
function map<T>(obj: StringMap<T>): T {   
    return obj[key as any as string];   
}

在这个例子中,我们创建了一个名为StringMap的接口,它接受一个泛型参数T。然后我们创建了一个名为map的函数,它接受一个StringMap类型的对象,并返回该对象的某个属性,该属性的类型是T。这样,我们就可以创建一个能够接受任何键的类型,但仍然保持类型安全的数据结构。

总结

总的来说,泛型是TypeScript中的一个强大工具,它可以让我们创建更加灵活和可重用的代码,同时还可以提高代码的安全性。在实践中,我们应该尽可能地使用泛型,特别是在我们需要处理多种数据类型的情况下。