当前位置: 首页 > news >正文

Typescript高级: 深入理解Extract类型

概述

  • 在TypeScript这一逐渐成为前端开发首选的静态类型检查语言中,类型系统提供了丰富的工具来帮助开发者编写更加健壮和可维护的代码。
  • 其中,Extract<T, U>是一个强大的内置实用类型,用于从一个联合类型T中提取出属于另一个类型U的那些类型。
  • 本文将深入探讨Extract类型的工作原理、应用场景以及如何有效利用它来提升代码的类型安全性和表达力。

什么是Extract<T, U>?

  • Extract<T, U>是一个条件类型,其定义为:从类型T中选取那些同时也可以被类型U赋值的类型
  • 简而言之,它像一个过滤器,保留了T中与U兼容的部分
  • 在TypeScript的类型系统中,兼容性意味着一个类型可以被另一个类型所赋值
  • 例如,任何派生自基类的类型都可以赋值给基类类型

基本用法

type A = string | number | boolean;
type B = number | boolean;

type C = Extract<A, B>; // 结果为: number | boolean
  • 在这个例子中,Extract<A, B>的结果是A类型中与B兼容的类型,即number和boolean

应用场景

  • 类型筛选:在处理复杂的联合类型时,Extract可以帮助我们精炼出特定的类型,特别是在大型项目中处理API响应或状态管理时,能够有效地缩小类型范围,提高代码的可读性和准确性

  • 泛型约束:结合泛型使用,Extract可以创建更加灵活且精确的类型约束。例如,在定义一个函数时,可以约束参数类型必须是某联合类型的一个子集,从而限制函数的适用范围

  • 类型映射:在实现类型映射或类型转换时,Extract可以帮助我们基于类型兼容性进行有选择的映射,特别是在处理多态或复杂类型系统设计时

实战案例


1 )从API响应中提取特定类型

  • 假设你正在处理一个API响应,该响应可能包含多种类型的数据,但你只关心其中的某些类型
    type ApiResponse = { type: 'user'; data: User } | { type: 'post'; data: Post } | { type: 'comment'; data: Comment };
    
    type UserSpecificResponse = Extract<ApiResponse, { type: 'user' }>;
    

2 ) 泛型约束与类型映射

  • 考虑一个函数,它应该只处理某些特定类型的对象集合
    // UserSpecificResponse 现在是 { type: 'user'; data: User }
    type Animal = { kind: 'dog' | 'cat' | 'bird' };
    type Canine = { kind: 'dog' };
    
    function processCaninesOnly<T>(items: Array<Extract<T, Canine>>): void {
      // ...
    }
    
    const dogs: Array<{ kind: 'dog' }> = [{ kind: 'dog' }, { kind: 'dog' }];
    processCaninesOnly(dogs); // 正确,因为dogs数组元素的kind只能是'dog'
    

总结

  • Extract<T, U>类型是TypeScript中一个强大的工具,它通过条件类型实现了类型筛选,增强了类型系统的灵活性和表达力
  • 在处理复杂类型逻辑、泛型约束以及类型映射时,Extract能够帮助开发者更精细地控制类型系统,写出更加健壮和易于维护的代码
  • 通过上述介绍和案例,希望你能够掌握并充分利用Extract类型在实际项目中的应用,进一步提升你的TypeScript编码体验
http://www.dtcms.com/a/10212.html

相关文章:

  • 2010-2022年各省新质生产力数据(含原始数据+测算代码+计算结果)
  • 【MySQL】库的操作和表的操作
  • Liunx系统中修改文件的创建时间以及访问时间
  • 汇编原理(二)
  • 为 AWS 子账户添加安全组修改权限
  • AI数据面临枯竭
  • 网络安全基础技术扫盲篇 — 名词解释
  • 粤嵌—2024/5/20—三角形最小路径和(✔)
  • 2024年5月19日优雅草蜻蜓K知识付费系统旗舰版v1.0.9进度更新
  • 开源大模型与闭源大模型
  • 服务器硬件基础知识
  • 5. C++网络编程-UDP协议的实现
  • 实验报告2-多线程并发
  • KuberSphere 安装kubernates
  • SVM兵王问题
  • Intel HDSLB 高性能四层负载均衡器 — 基本原理和部署配置
  • 设计模式八股文
  • Vue 跨域代理设置
  • Midjourney Describe API 使用文档
  • 专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(十三)
  • 03_前端三大件CSS
  • C++小游戏 合集
  • 人人皆是黑客?EvilProxy推出一键反向代理服务
  • MATLAB学习:频谱图的绘制
  • 基于开源ATmega8 无感BLDC程序移植到ATmega328PB
  • 几种常用的配置文件格式对比分析——ini、json、xml、toml、yaml
  • python类和对象
  • 一周股市价格为[2,6,1,4,8],求哪一天买入哪一天卖出,可获得最大收益,最大收益为多少——Java实现,详细注释
  • latex文字竖排
  • 美业美容院会员服务预约店铺管理小程序的效果是什么