TypeScript实战系列之强力爆破泛型的困扰

目录

  • 介绍
    • 开始
    • 如何理解泛型语法
    • 泛型约束
    • 泛型默认值
    • 练习
    • 后续

介绍

泛型在typescript 中使用频率相当高,也给了初学者相当大的阻碍。希望这一篇文章,能帮助你们爆破它。

开始

下面通过模拟实现一个简易版本的axios来引入泛型的使用

// axios.ts
type Method =
  | 'get'
  | 'GET'
  | 'delete'
  | 'Delete'
  | 'head'
  | 'HEAD'
  | 'options'
  | 'OPTIONS'
  | 'post'
  | 'POST'
  | 'put'
  | 'PUT'
  | 'patch'
  | 'PATCH'


interface AxiosRequestConfig {
    baseURL?: string //便于为 axios 实例的方法传递相对 URL
    url?: string // 请求地址 
    /* 注 ? 表示可选 */
    method?: Method // 请求方法 可选
    data?: any // post、patch 等类型请求的数据 可选
    params?: any // post、patch 等类型请求的数据 可选
    headers?: any
    responseType?: XMLHttpRequestResponseType
}

type AxiosResponse= {
    /**
     * 响应的data数据
     */
    data: any
    /**
     * 响应的状态码
     */
    status: number
  }
  

type AxiosPromise = Promise<AxiosResponse>



class Axios {
   default:AxiosRequestConfig={
   }

   constructor(initConfig: AxiosRequestConfig) {
    console.log('axios---init');
   }

   get(url: string, config?: AxiosRequestConfig): AxiosPromise{
    return new Promise((resolve)=>{
        resolve({
            data: {},
            status:200,
        })
    })
   }
}

export const createInstance=(config: AxiosRequestConfig)=>{
   const instance = new Axios(config)
   return instance
}


用它来模拟请求

import {createInstance} from "./axios"

const axios = createInstance({
    baseURL:'https://some-domain.com/api/'
})

axios.get('user/list').then(res=>{
    const {data} = res
})

痛点
这时候 我们使用data 里的数据 是没有代码提示的,因为现在data的类型就是any。
在这里插入图片描述

这肯定对于我们开发来说是不方便的!

预期

对于不同的请求,返回的数据格式是不同的。希望每个请求开发者都能自己去定义接口的请求类型!

解决

使用泛型就能完美解决这个痛点!

改造 :

type Method =
  | 'get'
  | 'GET'
  | 'delete'
  | 'Delete'
  | 'head'
  | 'HEAD'
  | 'options'
  | 'OPTIONS'
  | 'post'
  | 'POST'
  | 'put'
  | 'PUT'
  | 'patch'
  | 'PATCH'


interface AxiosRequestConfig<T=unknown> {
    baseURL?: string //便于为 axios 实例的方法传递相对 URL
    url?: string // 请求地址 
    /* 注 ? 表示可选 */
    method?: Method // 请求方法 可选
    data?: T // post、patch 等类型请求的数据 可选
    params?: any // post、patch 等类型请求的数据 可选
    headers?: any
    responseType?: XMLHttpRequestResponseType
}

type AxiosResponse<T=unknown>= {
    /**
     * 响应的data数据
     */
    data: T
    /**
     * 响应的状态码
     */
    status: number
  }
  

type AxiosPromise<T> = Promise<AxiosResponse<T>>



class Axios {
   default:AxiosRequestConfig={
   }

   constructor(initConfig: AxiosRequestConfig) {
    console.log('axios---init');
   }

   get<T=unknown>(url: string, config?: AxiosRequestConfig): AxiosPromise<T>{
    return new Promise((resolve)=>{
        resolve({
            //@ts-ignore
            data: {},
            status:200,
        })
    })
   }
}

export const createInstance=(config: AxiosRequestConfig)=>{
   const instance = new Axios(config)
   return instance
}

使用:

import {createInstance} from "./axios"

const axios = createInstance({
    baseURL:'https://some-domain.com/api/'
})

type UserType = {
    name:string,
    age:number
}

axios.get<UserType>('user/list').then(res=>{
    const {data} = res
})

在这里插入图片描述
在这里插入图片描述
总结: 泛型是一种用于创建可复用的函数或类的技术,它允许你在编写代码时指定类型参数,以使函数或类适用于不同类型的数据。

如何理解泛型语法

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

看到 语法会感到陌生。它没有什么特别,可以把它类比于函数的入参,你可以随意去定义它的参数名,但是一般ts规范使用 大写的英文字母。
在这里插入图片描述
例如:T 就是接受的类型 ,T可以在。只有在外部使用它时 ,T的类型才被确定!

function identity<T>(arg: T): T {
    let temp:T;
    let str  = '123'
    str as T
    return arg;
}

也可以接受多个外部类型

function cross<T,K>(arg1: T,arg2:K): T&K {
    return {
        ...arg1,...arg2
    };
}

泛型约束

想要限制外部传入类型必须带有 length 属性,可以使用关键字 extends

function loggingIdentity<T>(arg: T): T {
    console.log(arg.length);
    return arg;
}

在这里插入图片描述
改造后

外部传入的类型 必须带有length 属性 ,否则校验不通过

function loggingIdentity<T extends {length:number}>(arg: T): T {
    console.log(arg.length);
    return arg;
}

loggingIdentity({a:12,length:22})

泛型默认值

泛型也支持给默认值


type arrType<T=string> = {
    list:Array<T>
}

let obj:arrType ={
    list: ['2','3']
}

let obj1:arrType<number> ={
    list: [1,2]
}

练习

实现一个函数 来通过属性值来获得对应的值

function getValueByKey(obj:any,key:string){
  return obj[key]
}

let obj = {
    name:'kd',
    age:35
}

let value = getValueByKey(obj,'name')

在这里插入图片描述

但是现在没有代码提示,需要使用泛型,一个代表传入对象的类型,一个代表传入key 的类型


function getValueByKey<T,K>(obj:T,key:K):T[K]{
  return obj[key]
}

在这里插入图片描述
因为 ts 不知道 T 和 K 的 关系 所以会报错,但是我们开发知道他们的关系 K 是 属于 T的 key值,于是我们给他们加上 类型限制!


function getValueByKey<T extends {[P:string]:any},K extends keyof T>(obj:T,key:K):T[K]{
  return obj[key]
}

keyof 关键字 后面再介绍, 它的作用是取 类型的 key 值的!
在这里插入图片描述
代码提示就出来了! 至于为啥使用的时候可以省略尖括号 是因为类型推断
在这里插入图片描述
这时候 T 代表 {name:string,age:number} K 代表 “name” | “age”

当然你也可以自己指定

function getValueByKey<T extends {[P:string]:any},K extends keyof T>(obj:T,key:K):T[K]{
  return obj[key]
}



let obj = {
    name:'kd',
    age:35
}

let value = getValueByKey<typeof obj, keyof typeof obj>(obj,'age')

后续

后面再会出一篇ts的高级篇,里面会涉及到更多的泛型的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/370564.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【面试】冲刺春招!每天三十道面试题——Java基础篇(一)

目录 一 JDK 和 JRE 的区分 二 简述编码的作用以及记事本的实现原理 三 基本类型有哪些&#xff1f;分别占据多少空间&#xff1f; 四 java中布尔类型的空间大小是怎么定下来的&#xff1f;为什么不是1bit&#xff0c; 把考虑因素说一下 五 int类型和float类型哪一个精度更…

算法学习——华为机考题库5(HJ31 - HJ35)

算法学习——华为机考题库5&#xff08;HJ31 - HJ35&#xff09; HJ31 单词倒排 描述 对字符串中的所有单词进行倒排。 说明&#xff1a; 1、构成单词的字符只有26个大写或小写英文字母&#xff1b; 2、非构成单词的字符均视为单词间隔符&#xff1b; 3、要求倒排后的单…

使用yolov5时需要安装的requirements.txt

之前需要配置好pytorch&#xff0c;同时注意的是pytoorch版本需要在1.7以上 1.github下载好requirements.txt 文件内容如下&#xff1a; 2.在cmd命令行转移到yolov5所在文件夹及配置的yolo环境中&#xff0c;直接下载 pip install -r requirements.txt -i http://pypi.doub…

ElementUI Form:Form表单

ElementUI安装与使用指南 Form表单 点击下载learnelementuispringboot项目源码 效果图 el-form.vue&#xff08;Form表单&#xff09;页面效果图 项目里 el-form.vue代码 <script> export default {name: el_form,data() {var checkAge (rule, value, callback…

计算机速成课Crash Course - 28. 计算机网络

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 28. 计算机网络 (qq.com) 28. 计算机网络 互联网太棒啦&#xff0c;键…

uptrained的解释

问题来源 language model checkpoints with multihead attention (MHA) can be uptrained (Komatsuzaki et al., 2022) to use MQA with a small fraction of original training compute 而翻译词典无法翻译 解释&#xff1a; “uptrained” 这个词没有直接的中文翻译&…

k8s学习-Kubernetes的包管理器Helm

1.1 为何需要Helm Kubernetes能够很好地组织和编排容器&#xff0c;但它缺少⼀个更高层次的应用打包工具&#xff0c;而Helm就是来干这件事的。 先来看个例子。 比如对于⼀个MySQL服务&#xff0c;Kubernetes需要部署下面这些对象&#xff1a; &#xff08;1&#xff09;Serv…

【遥感入门系列】遥感电磁辐射与遥感过程

遥感电磁辐射是比较难理解也是非常重要的内容&#xff0c;对于一般学习遥感专业的人来说&#xff0c;只需要学习个大概&#xff0c;这个大概主要包括你需要理解几个概念以及能从电磁辐射原理上解释一些遥感现象&#xff0c;进而为遥感过程的理解打下一个基础&#xff0c;如果你…

揭秘备忘录模式:打造灵活高效的状态管理解决方案

备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为设计模式&#xff0c;它允许在不暴露对象内部状态的情况下捕获和恢复对象的内部状态。这种模式主要用于实现撤销操作。 在 Java 中&#xff0c;备忘录模式通常包括以下三个角色&#xff1a; 发起人&#xff08;O…

使用Java实现基于HTTP的分布式系统:让你的应用“四处开花”

在数字世界里&#xff0c;分布式系统就像是一个大家庭&#xff0c;每个成员&#xff08;即节点&#xff09;都有自己的任务和职责&#xff0c;共同维护整个家庭的运转。如果你想使用Java来实现这样一个大家庭&#xff0c;让应用在各个节点上“四处开花”&#xff0c;那就需要借…

设计模式1-访问者模式

访问者模式是一种行为设计模式&#xff0c;它允许你定义在对象结构中的元素上进行操作的新操作&#xff0c;而无需修改这些元素的类。这种模式的主要思想是将算法与元素的结构分离开&#xff0c;使得可以在不修改元素结构的情况下定义新的操作。 所谓算法与元素结构分离&#x…

css1文本属性

一.颜色&#xff08;color&#xff09;&#xff08;一般用16进制&#xff09; 二.对齐&#xff08;text-align) 三.装饰&#xff08;text-decoration&#xff09; 四.缩进&#xff08;text-indent&#xff09;&#xff08;一般用2em&#xff09;&#xff08;有单位&#xff09;…

面试数据结构与算法总结分类+leetcode目录【基础版】

&#x1f9e1;&#x1f9e1;&#x1f9e1;算法题目总结&#xff1a; 这里为大家总结数据结构与算法的题库目录&#xff0c;如果已经解释过的题目会标注链接更新&#xff0c;方便查看。 数据结构概览 Array & String 大家对这两类肯定比较清楚的&#xff0c;同时这也是面试…

idea中找到所有的TODO

idea中找到所有的TODO &#xff08;1&#xff09;快捷键 Alt6 &#xff08;2&#xff09;View -> Tool Windows -> TODO

【Chrono Engine学习总结】1-安装配置与程序运行

本文仅用于个人安装记录。 官方安装教程 https://api.projectchrono.org/8.0.0/tutorial_install_chrono.html Windows下安装 windows下安装就按照教程好了。采用cmake-gui进行配置&#xff0c;建议首次安装只安装核心模块。然后依此configure下irrlicht&#xff0c;sensor…

正则表达式可视化工具regex-vis

什么是正则表达式 &#xff1f; 正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特定字符、及这些特定字符的组合&#xff0c;组成一个“规则字符串”&#xff0c;这个“规则字符串”用来表达对字符串的一种过滤逻辑。【百度百科】 正则表达式用简短…

python 视频硬字幕去除 内嵌字幕去除工具vsr

项目简介 开源地址&#xff1a;https://github.com/YaoFANGUK/video-subtitle-remover Video-subtitle-remover (VSR) 是一款基于AI技术&#xff0c;将视频中的硬字幕去除的软件。 主要实现了以下功能&#xff1a; 无损分辨率将视频中的硬字幕去除&#xff0c;生成去除字幕后…

《学成在线》微服务实战项目实操笔记系列(P1~P49)【上】

《学成在线》项目实操笔记系列【上】&#xff0c;跟视频的每一P对应&#xff0c;全系列12万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。同时也欢迎大家提问与讨论&#xff0c;我会尽力帮大家解…

小华和小为的聚餐地点 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 小华和小为是很要好的朋友,他们约定周末一起吃饭。 通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达)。 求小华和小为都能到达的聚餐地点有多少个? 输入描述…

【小白开服日记】幻兽帕鲁服务器如何搭建?

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…