了解 TypeScript 泛型
介绍 中泛型的使用,并提供基于实际用例的示例,例如集合、错误处理方法、存储库模式等。本文希望通过泛型提供对软件抽象概念的直观理解。 在 本文中,我们将学习 TypeScript 中泛型的概念,并研究如何使用泛型来编写模块化、解耦和可重用的代码。在此过程中,我们将简要讨论它们如何适应更好的测试模式、错误处理方法以及域/数据访问分离。 一个现实世界的例子 # 我想进入泛型的世界,不是通过解释它们是什么,而是通过提供一个直观的例子来说明它们为什么有用。假设您的任务是构建一个功能丰富的动态列表。您可以将其称为数组、 或其他名称,具体取决于您的语言背景。也许这个数据结构还必须具有内置或可交换的缓冲区系统(如循环缓冲区插入选项)。
JavaScript 数组的包装器
它将是普通 ,以便我们可以使用我们的结构而不是普通数组。 您将遇到的直接问题是类型系统施加的约束。此时,您无 科威特手机号码列表 法以一种干净的方式将您想要的任何类型接受到函数或方法中(我们稍后将重新讨论此语句)。这里的语法.create()可能看起来任意,实际上,会更直接,但稍后您会明白为什么我们使用这个静态工厂方法。在内部,该create方法调用构造函数。 这很糟糕。我们在这个集合结构中有很多逻辑,并且我们公然复制它以支持不同的用例,在这个过程中完全打破了 DRY 原则。当我们决定更改实现时,我们必须在我们支持的所有结构和类型(包括用户定义的类型)中手动传播/反映这些更改,如上面的后一个示例所示。假设集合结构本身有 100 行长——维护多个不同的实现将是一场噩梦,其中它们之间唯一的区别是类型。
直接解决方案是考虑根超类型
我们必须在我们支持的所有结构和类型(包括用户定义的类型)中手动传播/反映这些更改,如上面的后一个示例所示。假设集合结构本身有 100 行长——维护多个不同的实 AERO 领先 现将是一场噩梦,其中它们之间唯一的区别是类型。 可能想到的一个(如果您愿意的话),特别是如果您具有 OOP 思维方式。例如,在 C# 中,有一个名为 的类型object,object是该类的别名System.Object。在 C# 的类型系统中,所有类型,无论是预定义的还是用户定义的,无论是引用类型还是值类型,都直接或间接继承自System.Object. 这意味着任何值都可以分配给类型的变量object(无需进入堆栈/堆和装箱/拆箱语义)。 在这种情况下,我们的问题似乎已经解决了。我们可以使用像这样的类型any,这将允许我们在集合中存储我们想要的任何内容,而不必复制结构,事实上,这是非常正确的。