Typescript泛型

目录

一.简介

二.泛型接口的使用

三.泛型约束


一.简介

TypeScript中泛型的定义:在定义函数时,不决定函数的参数类型,而是让调用者以参数的形式告知,函数的参数应该是什么样的类型。

使用泛型之前,我们写函数的类型,是这样的:

TypeScript 复制代码
function identity(arg: any): any {
  return arg;
}

尽管使用 any类型可以让我们接受任何类型的 arg 参数,但也让我们丢失了函数返回时的类型信息。如果我们传入一个数字,我们唯一知道的信息是函数可以返回任何类型的值

所以我们需要一种可以捕获参数类型的方式,然后再用它表示返回值的类型

TypeScript 复制代码
function identity<Type>(arg: Type): Type {
  return arg;
}

这个Type 允许我们捕获调用者提供的类型,使得接下来可以使用这个类型,可以看到,返回值也使用了这个类型。这就是泛型。函数的参数和返回值的类型不是固定的,而是由函数的调用者决定的。

我们有两种方式调用上边的泛型函数:

  • 传入所有的参数(包括类型参数)
TypeScript 复制代码
let output = identity<string>("myString");  // output: string

在这里,我们使用 **<>**而不是 **()**包裹了参数,并明确的设置 Type为 string作为函数调用的一个参数;

  • 使用类型推导
TypeScript 复制代码
let output = identity("myString"); // let output: string

这次我们并没有用 <> 明确的传入类型,当编译器看到 myString 这个值,就会自动设置 Type 为它的类型(即 string)。

二.泛型接口的使用

接口中也可以使用泛型:

TypeScript 复制代码
// 可以同时传入多个类型
interface User<T, N> {
    name: T,
    age: N
} 


const user: User<string, number> = {
    name: 'hsh',
    age: 18
}

user.name // ok
user.age // ok

三.泛型约束

有些时候,需要对Type做一些类型约束,以保证顺利通过编译。

假如现在有一个getLength函数:

TypeScript 复制代码
function getLength<T>(arg: T) {
    console.log(arg.length);  // Error: 类型"T"上不存在属性"length"
}

上边的写法会直接报错,因为Type可能是任意类型,而如果是number类型的话,是没有length属性的,这个时候要对泛型进行类型约束:

TypeScript 复制代码
// 使用接口约束
interface ILength {
    length: number
}

function getLength<T extends ILength>(arg: T) {
    console.log(arg.length);
}

getLength('111')  // ok
getLength(['111']) // ok
// getLength(111) // Error: 类型"number"的参数不能赋给类型"ILength"的参数

现在这个泛型函数被约束了,它不再适用于所有类型,我们需要传入符合约束条件的值

相关推荐
IT_陈寒10 小时前
Vite热更新失效?你可能漏了这个配置项
前端·人工智能·后端
FYKJ_201010 小时前
django药饮个性化推荐系统54839-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
10年前端老司机11 小时前
Next.js+LangGraph.js+ 简历工具AI Agent完整落地
前端·langchain·agent
IT_陈寒15 小时前
Java中equals方法比了个寂寞?原来这才是正确的重写姿势
前端·人工智能·后端
默_笙15 小时前
🚓 分诊台与拆题术:让 RAG 学会判断和规划
前端·javascript
CopyCode15 小时前
用 AI 迁项目有多爽?我把 Webpack 迁 Vite 的全过程记下来了
前端·架构
去伪存真15 小时前
Electron 自动化发布指南:GitHub Actions 跨平台打包全纪录
前端·electron
计算机魔术师15 小时前
OpenAI智能体失控闯进美国政府网站,53张用户图片外泄背后
前端
颜进强15 小时前
14 · NestJS ExecutionContext 执行上下文:守卫、拦截器、过滤器拿到的"同一个 context",为什么能力不一样?
前端·后端·ai编程
濮水大叔15 小时前
Cabloy全栈框架的两个SSR入口:Vona集成式SSR vs Zova独立式SSR
typescript·node.js·全栈