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

56 阅读4分钟

TypeScript 中的泛型是一种强大的工具,它可以增加代码的灵活性和安全性。泛型允许你编写可重用的代码组件,同时保持类型检查。在本文中,我将分享一些围绕 TypeScript 类和泛型的使用实践,以及如何使用类型约束来提高代码的质量。

1. 简单的泛型示例

首先,让我们从一个简单的泛型示例开始,以理解泛型的基本概念:

// 使用泛型创建一个可重用的数组反转函数
function reverseArray<T>(array: T[]): T[] {
    return array.reverse();
}

const numbers = [1, 2, 3, 4, 5];
const reversedNumbers = reverseArray(numbers); // 类型推断:reversedNumbers 是 number[] 类型

const strings = ["apple", "banana", "cherry"];
const reversedStrings = reverseArray(strings); // 类型推断:reversedStrings 是 string[] 类型

在上面的示例中,reverseArray 函数接受一个泛型类型 T 的数组,并返回一个相同类型的数组。通过这种方式,你可以在不同类型的数组上使用相同的函数,而且 TypeScript 会进行类型检查。

2. 类中的泛型

你还可以在类中使用泛型。这对于创建通用的数据结构非常有用。例如,创建一个通用的堆栈(stack)类:

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

    push(item: T): void {
        this.items.push(item);
    }

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

    size(): number {
        return this.items.length;
    }
}

const numberStack = new Stack<number>();
numberStack.push(1);
numberStack.push(2);
console.log(numberStack.pop()); // 输出: 2

const stringStack = new Stack<string>();
stringStack.push("hello");
stringStack.push("world");
console.log(stringStack.pop()); // 输出: "world"

这个通用的堆栈类可以存储不同类型的数据,并且在使用时 TypeScript 会进行类型检查。

3. 类型约束

有时候,你希望泛型类型满足某些条件。这时可以使用类型约束来增加代码的安全性。例如,你想确保泛型类型具有某个特定方法:

interface HasLength {
    length: number;
}

function logLength<T extends HasLength>(item: T): void {
    console.log(item.length);
}

logLength("hello"); // 输出: 5
logLength([1, 2, 3]); // 输出: 3
logLength({ length: 10 }); // 输出: 10
logLength(42); // 错误:数字类型没有 length 属性

在上面的示例中,我们使用了 extends 关键字来约束泛型 T 必须具有 length 属性。这样可以避免在不具备 length 属性的数据上调用 logLength 函数。

4. 多重泛型参数

有时候,你可能需要多个泛型参数来增加灵活性。例如,你想创建一个键值对存储器:

class KeyValuePair<K, V> {
    private data: Record<K, V> = {};

    set(key: K, value: V): void {
        this.data[key] = value;
    }

    get(key: K): V | undefined {
        return this.data[key];
    }
}

const store = new KeyValuePair<string, number>();
store.set("age", 30);
console.log(store.get("age")); // 输出: 30

在这个例子中,我们使用了两个泛型参数 KV 分别表示键和值的类型。

总结一下,TypeScript 中的泛型是一种非常有用的工具,可以增加代码的灵活性和安全性。你可以在函数、类和接口中使用泛型,并使用类型约束来确保泛型类型满足特定条件。这使得你可以编写更加通用和类型安全的代码。

TypeScript的简单介绍

TypeScript中的类(Class)是一种面向对象编程(OOP)的核心概念,它允许你创建具有属性和方法的自定义数据结构。下面是关于TypeScript类的简要介绍:

  1. 类的定义: 类是一种蓝图或模板,用于创建具有相似属性和方法的对象。在TypeScript中,可以使用class关键字来定义类,如下所示:

  2. 属性和构造函数: 类中可以定义属性和构造函数。构造函数用于初始化类的实例,通常用于设置对象的初始状态。属性则用于存储对象的数据。

  3. 方法: 类中可以包含方法,这些方法是对象可以执行的操作。方法可以访问类的属性和其他方法。

  4. 实例化: 类定义了对象的结构,但要创建类的实例,需要使用new关键字:

  5. 继承: TypeScript支持类之间的继承关系。子类可以继承父类的属性和方法,并可以添加自己的属性和方法。

  6. 访问修饰符: TypeScript支持publicprivateprotected等访问修饰符,用于控制属性和方法的可访问性。默认情况下,成员是public的。

  7. 静态成员: 类可以包含静态属性和方法,这些成员不依赖于类的实例而直接属于类本身。

  8. 抽象类: 抽象类是不能被实例化的类,它用于定义其他类的结构。抽象类可以包含抽象方法,要求子类必须实现这些方法。

总之,TypeScript中的类是一种强大的工具,用于建模和组织代码,支持面向对象编程的核心概念,包括封装、继承和多态。通过类,你可以创建可重用的代码模块,提高代码的可维护性和可读性。