万一使用泛型 TypeScript 的主要原因是什么?

What is main reason to use generics TypeScript in case?

有一个如何在 TypeScript 中使用泛型类型的默认示例:

class Greeter<T> {
    greeting: T;
    constructor(message: T) {
        this.greeting = message;
    }
    greet() {
        return this.greeting;
    }
}

let greeter = new Greeter<string>("Hello, world");

let button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function() {
    alert(greeter.greet());
}

document.body.appendChild(button);

使用这个的主要原因是什么?为什么我不能在这个例子中只使用 :any 类型而不是 T?

在 TypeScript(和任何其他编程语言)中使用泛型的主要原因是使类型(classes、类型或接口)能够充当参数。它帮助我们为不同类型的输入重用相同的代码,因为类型本身可以作为参数使用。

泛型的一些好处是:

  • 定义输入和输出参数类型之间的关系。例如,function test <T>(input: T[]): T { ... } 允许您确保输入和输出使用相同的类型,尽管输入为数组。

  • 编译时将提供更强大的类型检查。在上面的示例中,编译器让您知道数组方法可用于 input 而不是任何其他方法。

  • 您可以删除一些不必要的类型转换。例如,当您有 const list: Array<Item> = [],遍历数组元素时,您将可以访问所有 Item 成员。

  • 使用泛型,您可以定义更通用的算法。例如,假设您有一个名为 Account 的基 class,其中包含一些方法和属性。后来,其他几个 classes(CheckingSavingMoneyMarket)扩展了这个 class。你可以有一个函数对任何扩展的 classes 执行一些操作,例如 function getBalance <T extends Account>(account: T): number { ... }.