什么是TypeScript中的泛型?
TypeScript 是 "JS 的超集",由于类型检查的巨大威力,使得构建可维护、可理解和可扩展的应用程序变得更加容易。
泛型在TypeScript中发挥着重要作用,因为它允许我们编写可重复使用的代码,接受值和类型作为参数。
函数中的泛型
泛型帮助我们使我们的代码更加可重复使用。让我们试着理解什么是泛型,以及为什么我们需要它们的帮助。
我们可以做的一件事是设置一个任意类型,这样String、Number和Person类型的值都可以在同一个函数中作为参数调用。不幸的是,这样做带来的问题比它解决的要多(一般来说,如果你打算经常使用any类型,也许最好保持它是纯JS)。
使用泛型解决 "可重用性问题" - 一个例子:
converToValueArray函数接收一个所选类型的值,并返回一个该类型的数组。Array 。因此,例如,如果值是字符串类型,那么返回类型是Array。
让我们看看TypeScript是如何显示错误的,当我们定义我们的通用类型:
请注意,在第18行,使用泛型后,如果我们想访问年龄,它会显示正确的错误,这是我们希望在任何种类的错误中得到早期反馈。
推断类型
让我们定义一个接受通用类型的函数。
function convertToArray<T>(args: T): Array<T> {
我们可以通过两种方式调用该函数
convertToArray("someString");
convertToArray<String>("someString");
正如我们所看到的,如果类型没有在<>中传递,那么类型会被自动推断出来。类型推断使代码更短,但在复杂的定义中,我们可能需要明确地传递类型。
多于一个通用类型
就像函数参数一样,我们可以传递一个以上的类型,这与函数参数的数量无关。例如
function doStuff<T, U>(name: T): T {
上述函数可以被调用如下。
doStuff<String, Number>("someString");
泛型约束
到目前为止,很明显,泛型是一种编写代码的方式,这样我们的代码可以支持一个以上的类型,并且类型可以作为一个参数传递。
鉴于这些知识,传递的类型可以是任何预定义的类型或复杂的用户定义的类型。
有时,如果我们想从通用类型的变量中访问任何函数,就会出现错误。 因此,我们可以为任何泛型添加一些约束条件,TS将确保只有那些符合约束条件的值才能被传递给函数或类。让我们为我们的泛型函数定义添加一些约束条件。
- 第4行:我们对类型T进行了扩展,使其具有一个长度属性。
- 第5行:错误消失了,即属性length不存在于类型 "T "上。
- 第10行:当我们用数字调用该函数时,它抛出了错误,说明它不符合约束条件
- 第12行和第13行:当我们传递有效的数据,如字符串或数组,TS没有抛出一个错误。
这篇文章就写到这里,我希望你了解了泛型的基本知识和它产生的价值。
如果你不知道泛型的基础知识,它看起来就很复杂。
我希望你的时间是值得阅读这篇文章的。