搜索
首页web前端js教程TypeScript 泛型:完整指南

TL;DR: TypeScript 泛型允许开发人员编写可重用的代码,这些代码可以处理各种数据类型,同时保持类型安全。它们对于构建健壮且可扩展的 TypeScript 应用程序至关重要。

TypeScript Generics: A Complete Guide为了确保代码透明且可管理,Typescript 需要对多种数据进行安全有效的管理。 Typescript 的核心功能之一是 Typescript 泛型,它允许创建函数、类和接口,同时遵守严格的类型限制。泛型可以让您编写更少的代码,减少错误,最重要的是,可以为不同的数据类型构建灵活的组件。

本文探讨了 Typescript 泛型的基础知识,包括它们在函数、类和接口中的用法,并演示了它们如何使代码具有通用性和健壮性。

什么是 Typescript 泛型?

Typescript 泛型可以使用占位符类型定义 Typescript 代码,使其灵活、可扩展和可重用,同时保持类型安全。

Typescript 在编译时作为定义泛型类型的占位符进行类型安全检查。当组件被实现时,实际类型将取代占位符。这种技术使管理和减少口是心非变得更加容易,因为您不需要为每种数据类型实现不同的实现。

如果没有泛型,您将编写一个函数或类的多个版本来处理不同的数据类型,从而导致代码重复。泛型允许单个实现可重用于各种类型,同时保留静态类型检查。

下一节中的代码示例将帮助您理解这种差异。

何时使用 Typescript 泛型?

泛型可以在打字稿的不同部分使用,以帮助更有效地管理类型。它们在函数、接口、类和其他灵活性至关重要的结构中发挥着重要作用。

1. 函数中的泛型类型

泛型经常应用于函数中以减少冗余。例如,考虑一个采用字符串或数字作为参数的函数。

function identity(value: any): any {
  return value;
}
const result1 = identity(42); // result1: any
const result2 = identity("hello"); // result2: any

这个功能运行良好。但它使用任何类型,这意味着 Typescript 会失去对特定类型的跟踪。因此,返回值的类型为 any, 并且 Typescript 无法再强制执行类型安全。如果我们需要维护类型安全,则必须编写两个不同的函数,一个返回字符串,另一个返回数字。然而,这种方法会增加代码重复。

我们可以通过使用泛型来保留类型信息来改进上述功能。

function identity(value: any): any {
  return value;
}
const result1 = identity(42); // result1: any
const result2 = identity("hello"); // result2: any

T 表示该方法在本例中使用的类型。如果存在,Typescript 将确认输入类型和返回参数中的类型是否相同。

此外,我们可以在不显式定义参数类型的情况下定义函数。

function identity<t>(value: Type): T {
  return value;
}
const result1 = identity<number>(42); // result1: number
const result2 = identity<string>("hello"); // result2: string
</string></number></t>

在 Typescript 中,在单个函数或组件中处理多种类型时,您可以使用多个泛型类型参数。例如,您可能需要一个接受两种不同类型的输入并将它们作为一对返回的函数。

const result3 = identity(100); // result3: number
const result4 = identity("world"); // result4: string

在本例中,该函数返回一个元组,其中第一个元素的类型为 T 类型,第二个元素的类型为 U。这使得函数能够对两种不同类型进行类型安全处理。

2. TypeScript 中的默认类型

在 Typescript 中,您可以为泛型提供默认类型,使其成为可选类型。如果未提供类型,Typescript 将使用默认类型。

function multipleParams<t u>(first: T, second: U): [T, U] {
 return [first, second];
}
const result1 = multipleParams<string number>("hello", 42); // result1: [string, number]
const result2 = multipleParams<string number>("hello", "world"); // result2: gives a type error
</string></string></t>

在此示例中,类型参数 T 默认为字符串。如果开发者在调用函数时没有指明具体类型,T将默认为字符串。

3. 通用接口

Typescript 泛型也可以应用于接口。想象一下,您想要定义一个 Box 接口,其值为 any 类型。

function createArray<t string>(length: number, value: T): T[] {
 return Array(length).fill(value);
}

const stringArray = createArray(3, "hello"); // T defaults to string, so stringArray is a string array
const numberArray = createArray<number>(3, 42); // T is explicitly set to a number, so numberArray is a number array
</number></t>

这更等于通用函数示例;由于我们没有定义特定类型,因此该代码也可以正常工作。但是,由于该值的类型为any,,我们可能会遇到与类型相关的错误。

为了保护类型,我们可以在这里定义一个通用接口。

interface Box {
  value: any;
}
const numberBox: Box = { value: 123 }; // correct
const stringBox: Box = { value: "hello" }; // correct

接口是通用的,其值类型严格限制为 Type 变量。在创建实例时,可以将 Type 变量指定为数字或字符串,以便 Typescript 确保遵循适当的类型。

4. 泛型类

还可以使用泛型编写类来处理不同类型,同时保持类型安全。让我们创建一个 Storage 类,它可以存储和检索 any 类型的值。

interface Box<type> {
  value: Type;
}
const numberBox: Box<number> = { value: 123 }; // number
const stringBox: Box<string> = { value: "hello" }; // string
const stringBox2: Box<string> = { value: 123 }; // incorrect
</string></string></number></type>

这个类可以工作,但是由于数据的类型为 any, getItem 方法返回 any, 删除类型安全。因此,我们可以使用泛型重写类来提高类型安全性。

class Storage {
  private data: any;
  setItem(item: any): void {
    this.data = item;
  }
  getItem(): any {
    return this.data;
  }
}
const storage = new Storage();
storage.setItem(123);
const item = storage.getItem();

在本例中,T 类型由 Storage 类使用。当您在创建实例时定义数据类型时,Typescript 可确保数据正确。此代码示例中的 getItem 方法将生成一个数字。

5. 通用约束

您可以使用泛型约束来限制泛型可以接受的类型,确保它们具有特定的属性。

例如,如果您有一个函数需要访问输入的 length 属性,则可以使用约束来确保仅允许具有 length 属性的类型。这可以防止 Typescript 给出错误或让不兼容的类型漏掉。

function identity(value: any): any {
  return value;
}
const result1 = identity(42); // result1: any
const result2 = identity("hello"); // result2: any

此处,值 T 未使用 length 属性定义。要忽略这个问题,我们可以添加一个约束,指定 T 必须具有 length 属性。我们通过说 T 延伸 { length: number }.
来做到这一点

function identity<t>(value: Type): T {
  return value;
}
const result1 = identity<number>(42); // result1: number
const result2 = identity<string>("hello"); // result2: string
</string></number></t>

现在,这个函数将具有 length 属性;它不会给出任何错误,并将按照输入的长度执行。

结论

Typescript 泛型允许您编写灵活、可回收且类型安全的代码。您可以使用具有这些泛型的类、方法和接口来管理许多数据类型,而无需重复代码。通用约束、众多类型和默认类型是我们在本文中讨论的一些关键用例,并展示了每种约束如何提高程序的可扩展性和可维护性。

了解 Typescript 泛型可以帮助您编写更精确、适应性更强且类型安全的代码,使您的 Typescript 应用程序更加健壮。

相关博客

  • Webpack 与 Vite:哪个捆绑器适合您?
  • 使用单 Spa 构建微前端:指南
  • 使用 RxJS 掌握异步 JavaScript
  • Axios 和 Fetch API?选择正确的 HTTP 客户端

以上是TypeScript 泛型:完整指南的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
在JavaScript中替换字符串字符在JavaScript中替换字符串字符Mar 11, 2025 am 12:07 AM

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

jQuery检查日期是否有效jQuery检查日期是否有效Mar 01, 2025 am 08:51 AM

简单JavaScript函数用于检查日期是否有效。 function isValidDate(s) { var bits = s.split('/'); var d = new Date(bits[2] '/' bits[1] '/' bits[0]); return !!(d && (d.getMonth() 1) == bits[1] && d.getDate() == Number(bits[0])); } //测试 var

jQuery获取元素填充/保证金jQuery获取元素填充/保证金Mar 01, 2025 am 08:53 AM

本文探讨如何使用 jQuery 获取和设置 DOM 元素的内边距和外边距值,特别是元素外边距和内边距的具体位置。虽然可以使用 CSS 设置元素的内边距和外边距,但获取准确的值可能会比较棘手。 // 设置 $("div.header").css("margin","10px"); $("div.header").css("padding","10px"); 你可能会认为这段代码很

10个jQuery手风琴选项卡10个jQuery手风琴选项卡Mar 01, 2025 am 01:34 AM

本文探讨了十个特殊的jQuery选项卡和手风琴。 选项卡和手风琴之间的关键区别在于其内容面板的显示和隐藏方式。让我们深入研究这十个示例。 相关文章:10个jQuery选项卡插件

10值得检查jQuery插件10值得检查jQuery插件Mar 01, 2025 am 01:29 AM

发现十个杰出的jQuery插件,以提升您的网站的活力和视觉吸引力!这个精选的收藏品提供了不同的功能,从图像动画到交互式画廊。让我们探索这些强大的工具: 相关文章: 1

HTTP与节点和HTTP-Console调试HTTP与节点和HTTP-Console调试Mar 01, 2025 am 01:37 AM

HTTP-Console是一个节点模块,可为您提供用于执行HTTP命令的命令行接口。不管您是否针对Web服务器,Web Serv

自定义Google搜索API设置教程自定义Google搜索API设置教程Mar 04, 2025 am 01:06 AM

本教程向您展示了如何将自定义的Google搜索API集成到您的博客或网站中,提供了比标准WordPress主题搜索功能更精致的搜索体验。 令人惊讶的是简单!您将能够将搜索限制为Y

jQuery添加卷轴到DivjQuery添加卷轴到DivMar 01, 2025 am 01:30 AM

当div内容超出容器元素区域时,以下jQuery代码片段可用于添加滚动条。 (无演示,请直接复制到Firebug中) //D = document //W = window //$ = jQuery var contentArea = $(this), wintop = contentArea.scrollTop(), docheight = $(D).height(), winheight = $(W).height(), divheight = $('#c

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具