TS 入门(六):TypeScript泛型编程

前言

在前三章中,我们介绍了 TypeScript 的基础知识、函数与对象类型。在本章中,我们将探讨更高级的类型和类型操作,包括联合类型、交叉类型、字面量类型、类型断言、类型兼容性和类型守卫等内容。通过这些高级特性,你将能够编写出更加灵活和强大的代码。

回顾接口与类

在上一章中,我们学习了以下内容:

  • 接口:包括基本接口、可选属性和只读属性、函数类型接口、可索引类型、接口继承。
  • 类:包括基本类、类的成员、构造函数、继承和派生类、公有、私有和受保护的修饰符、静态属性和方法、抽象类。

在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


1. 泛型函数

泛型函数允许你在定义函数时指定类型参数,而不是具体的类型。这样可以在函数内部使用不同的类型。

function identity<T>(arg: T): T {
  return arg;
}

let output1 = identity<string>("我的名字"); // 输出类型为 'string'
let output2 = identity<number>(100); // 输出类型为 'number'
console.log(output1); // "我的名字"
console.log(output2); // 100

泛型函数还可以使用类型推断,根据传入的参数自动确定类型。

let output3 = identity("自动推断类型"); // 输出类型为 'string'
console.log(output3); // "自动推断类型"

2. 泛型接口

你可以使用泛型为接口定义类型参数,从而使接口更加灵活。

interface GenericIdentityFn<T> {
  (arg: T): T;
}

function identity2<T>(arg: T): T {
  return arg;
}

let myIdentity: GenericIdentityFn<number> = identity2;
console.log(myIdentity(42)); // 42

3. 泛型类

泛型也可以应用于类,使类能够处理不同的类型。

class GenericNumber<T> {
  zeroValue: T;
  add: (x: T, y: T) => T;

  constructor(zeroValue: T, addFn: (x: T, y: T) => T) {
    this.zeroValue = zeroValue;
    this.add = addFn;
  }
}

let myGenericNumber = new GenericNumber<number>(0, (x, y) => x + y);
console.log(myGenericNumber.add(5, 10)); // 15

4. 泛型约束

有时候我们希望泛型类型满足一定的条件,可以通过泛型约束来实现。

interface Lengthwise {
  length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
  console.log(arg.length); // 现在我们知道arg有length属性了
  return arg;
}

loggingIdentity({ length: 10, value: 3 }); // 输出: 10
// loggingIdentity(3); // 错误,number类型没有length属性

5. 多重类型参数与默认类型

a. 多重类型参数

泛型函数和类可以接受多个类型参数。

function map<T, U>(array: T[], transform: (item: T) => U): U[] {
  let result: U[] = [];
  for (let item of array) {
    result.push(transform(item));
  }
  return result;
}

let numbers = [1, 2, 3];
let strings = map(numbers, num => num.toString());
console.log(strings); // ["1", "2", "3"]

b. 默认类型参数

你可以为泛型参数指定默认类型,这样在没有明确传入类型参数时将使用默认类型。

class Container<T = string> {
  content: T;
  
  constructor(content: T) {
    this.content = content;
  }
}

let stringContainer = new Container("这是一个字符串");
console.log(stringContainer.content); // "这是一个字符串"

let numberContainer = new Container<number>(42);
console.log(numberContainer.content); // 42

结语

通过本章的学习,你应该对 TypeScript 中的泛型编程有了更深入的理解。掌握泛型将使你能够编写更加灵活和可重用的代码。在下一章中,我们将继续探讨 TypeScript 中的模块与命名空间,包括导入和导出、默认导出、重命名导入和导出、命名空间等内容。务必掌握好每个概念,它们将为你后续学习 TypeScript 提供坚实的基础。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: TypeScript中的泛型是指一种能够将类型作为参数进行传递的特性。泛型可以帮助我们编写更加通用的代码,因为我们可以在函数、类和接口中使用它来适应各种不同的数据类型。通过使用泛型,我们可以减少代码的冗余,并提高代码的可读性和可维护性。 在TypeScript中,我们可以使用<>符号来定义泛型类型参数,例如: ```typescript function identity<T>(arg: T): T { return arg; } let output = identity<string>("hello world"); ``` 在上面的代码中,identity函数使用了泛型类型参数T,这样我们就可以将任意类型的值传递给这个函数。在这里,我们将泛型类型参数指定为string,所以函数返回的是一个字符串类型的值。 除了函数,泛型还可以用于类和接口的定义中。在实际编程中,使用泛型可以使代码更加灵活、可扩展和易于维护。 ### 回答2: TypeScript泛型指的是在定义函数、类或接口时允许使用参数化类型的特性。通过使用泛型,我们可以在不指定具体类型的情况下编写可复用的代码。 泛型能够实现类型的参数化,使得代码更加灵活和可复用。通过在尖括号中定义泛型参数,我们可以在函数或类中使用这些参数来表示未知的类型。当我们调用带有泛型类型参数的函数或类时,可以根据实际的类型来替换泛型参数。 泛型在多种情况下都有很好的应用,例如可以用于函数中的参数类型、返回值类型以及变量类型的定义。通过泛型,我们可以在定义时指定输入参数的类型,并在使用时获取输入参数的类型,从而增加代码的灵活性和安全性。 泛型还可以在类中使用,定义类的属性、方法或构造函数的参数的类型。通过泛型,可以实现对不同类型的对象进行操作,提高代码的可复用性。 总之,TypeScript泛型为我们提供了一种参数化类型的方式,使代码更加灵活可复用。通过使用泛型,我们可以在定义函数、类或接口时不指定具体类型,在使用时再动态地传入类型参数,从而更好地应对不同情况和需求。 ### 回答3: TypeScript泛型是一种在编写代码时能够处理多种数据类型的机制。它允许我们在定义变量、函数或类时不指定具体的类型,而是在使用时根据需求进行动态的类型推断和检查。 泛型能够提高代码的重用性和灵活性。它让我们能够编写更通用的代码,以适应不同的数据类型。例如,我们可以定义一个泛型函数来处理任意类型的数组,而不需要为每种类型定义不同的函数。这样一来,我们就可以在需要处理不同类型数据的时候直接调用这个函数,而无需重复编写类似的代码。 除了函数之外,泛型还可以用于类和接口的定义。我们可以定义一个泛型类来表示一种具有通用特性的数据结构,例如链表或栈。在类的内部,我们可以使用泛型类型作为成员变量或方法参数,以便处理不同类型的数据。类似地,我们也可以使用泛型接口来定义一种约束规范,以确保实现类符合要求。 另外,TypeScript还提供了一些高级的泛型技巧,例如泛型约束和泛型扩展。使用泛型约束,我们可以限制泛型类型只能是特定的类型或遵循特定的接口。通过泛型扩展,我们可以在泛型类型上定义更丰富的操作,以便更灵活地处理数据。 总之,TypeScript泛型是一种强大的机制,它可以在我们编写代码时提供更多的灵活性和可重用性。使用泛型,我们可以编写更通用、更安全的代码,以适应不同的数据类型和需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ziyu_jia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值