发布于 2026-01-06 3 阅读
0

TypeScript 泛型

TypeScript 泛型

在 TypeScript 中使用类型时,我们假设我们知道要使用的类型是什么。

例如,要定义以下日志函数:

const logAndReturn = (input: string): string => {
  console.log(input);
  return input;
};
Enter fullscreen mode Exit fullscreen mode

在这个简单的函数中,我们期望传入一个字符串,返回一个字符串,仅此而已。
但为什么它只能处理字符串呢?
如果我们尝试传入一个问号呢number

数字类型错误

嗯,这有点傻。我们不能把数字传递给这个函数。
这完全说得通。

解决此问题的一种可能方法是使用any作为类型。

const logAndReturn = (input: any): any => {
  console.log(input);
  return input;
};
Enter fullscreen mode Exit fullscreen mode

但这样做会导致无法从外部识别类型。
这基本上就相当于你根本没用 TypeScript。

所谓“外部使用”,是指无论我们在哪里调用这个函数,你都应该能看到它被强制转换为什么类型,就像这样:

TypeScript 任何类型

那么接下来呢?

TypeScript 泛型

这正是泛型类型发挥作用的地方。它们可以用来标识被调用的特定函数的类型。

使函数本身无需知道它正在处理哪种类型。

要识别泛型类型,必须在函数前加上泛型变量,<Type>其中Type是泛型变量。

注:我们通常用T它来表示通用类型。但是,它并不局限于任何特定名称。

让我们把上面的函数改写成一个通用的类型化函数。

const logAndReturn = <T>(input: T): T => {
  console.log(input);
  return input;
};
Enter fullscreen mode Exit fullscreen mode

现在,如果我们想使用这个函数并传递一个字符串,我们可以这样做:

logAndReturn<string>('a string');
Enter fullscreen mode Exit fullscreen mode

经查阅,报告内容如下:

通用字符串类型

如果我们想将其转换为我们的数字,我们可以更改所使用的通用类型。

logAndReturn<number>(123);
Enter fullscreen mode Exit fullscreen mode

通用类型编号转换

如您所见,这非常强大,因为我们不需要预先知道类型,但可以保持对正确类型的引用。

这种方法并不局限于这些现有类型。我们甚至可以定义一个自定义接口来使用。

interface User {
  firstname: string;
  lastname: string;
}

logAndReturn<User>({firstname: 'Chris', lastname: 'Bongers'});
Enter fullscreen mode Exit fullscreen mode

在这种情况下,我们的函数将需要指定User类型。

结论

希望您对泛型类型及其用法有了初步的了解。
在接下来的文章中,我将深入探讨具体的用例,以便更全面地理解它们。

感谢阅读,让我们保持联系!

感谢您阅读我的博客。欢迎订阅我的电子邮件简讯,也可以在FacebookTwitter上关注我。

文章来源:https://dev.to/dailydevtips1/typescript-generic-types-3j38