码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • typescript之神奇的infer - 推断任何你想知道的类型


    infer 字面意思是推断

    在ts中可以借助这个关键字得到一些你想要推断出某个值的类型,最常见的场景就是获取某个类库中没有导出的类型,比如 A 库导出了 数组类型 Arr, 但是数组中元素的类型没有导出

    A库代码

    interface IArrElement {
    	a: string;
    	b: string;
    }
    
    export interface IArr: IArrElement[]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    现在你代码中需要使用 IArrElement 如何使用呢

    不使用 infer 之前我们可以这么写

    import {IArr} from 'A';
    const arr: IArr;
    type IArrElement = typeof arr[0];
    
    • 1
    • 2
    • 3

    有效但不优雅

    我们使用 infer 试一试

    import {IArr} from 'A';
    type IArrElement = IArr extends (infer R)[] ? R : any;
    
    • 1
    • 2

    我们稍微解释一下这行代码,IArr extends (infer R)[] 是判断 IArr 是否是数组,然后使用 infer R 来对数组内元素类型做一个‘占位’,如果是数组,那么就返回这个占位的类型,也就是 IArrElement, 如果不是给一个默认值 any

    看下效果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7gyuwWRN-1659587562739)(https://km.woa.com/gkm/api/img/cos-file-url?url=https%3A%2F%2Fkm-pro-1258638997.cos.ap-guangzhou.myqcloud.com%2Ffiles%2Fphotos%2Fpictures%2F202208%2F1659587366-5778-62eb4b268d169-947722.png&is_redirect=1)]

    这其实就是解包操作,我们可以封装成一个type来使用,更加易于复用

    import {IArr} from 'A';
    type Unpacked<T> = T extends (infer R)[] ? R : T;
    type IArrElement = Unpacked<IArr>;
    
    • 1
    • 2
    • 3

    typescript中有很以及封装好的现成的类似的type都是基于 infer关键字,非常好用

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KDimp9Ag-1659587562740)(https://km.woa.com/gkm/api/img/cos-file-url?url=https%3A%2F%2Fkm-pro-1258638997.cos.ap-guangzhou.myqcloud.com%2Ffiles%2Fphotos%2Fpictures%2F202208%2F1659587194-2224-62eb4a7a364df-797635.png&is_redirect=1)]

    具体原理也都是使用 extends 来判断是否是某种类型,然后返回一个占位(推断)

  • 相关阅读:
    使用51单片机控制T0和T1分别间隔1秒2秒亮灭逻辑
    一文搞懂什么是 GNU/Linux 操作系统
    【408数据结构与算法】—直接插入排序(十五)
    深度学习笔记其七:计算机视觉和PYTORCH
    09-07 周三 周志华-机器学习的下载和阅读总结
    MySQL如何互换表中两列的数据
    Ant Design Pro【面包屑导航】二级路由和三级路由都有component的情况,三级不显示component的页面,怎么解决?
    网络安全(黑客)-零基础小白高效自学
    Idea断点调试(debug)详解
    基于Java的在线问卷调查系统的设计与实现(源码+lw+部署文档+讲解等)
  • 原文地址:https://blog.csdn.net/yanxiaomu/article/details/126157294
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号