记录下最近泛型(ts)的使用心得

简介: 软件设计中规范和灵活往往是相悖的,约束越多规范性越强反之灵活性越低。一款优秀的软件系统在这两者之间把握的一定很好。对于typescript而言,他给js上上了一道类型的加锁,如果说any是打开这把锁的钥匙那泛型同时也给了js类型一定的自主空间,就是我们常用的泛型。

介绍


软件设计中规范和灵活往往是相悖的,约束越多规范性越强反之灵活性越低。一款优秀的软件系统在这两者之间把握的一定很好。对于typescript而言,他给js上上了一道类型的加锁,如果说any是打开这把锁的钥匙那泛型同时也给了js类型一定的自主空间,就是我们常用的泛型。

  • 泛型方便创建可重用的组件,一个组件可以支持多种类型的数据。
  • 个人泛型和js变量相比既保留了js变量的灵活性又增加了变量的约束。

使用


泛型函数

  • 泛型函数:在typescript用来实现函数的重用并且具有固定返回值类型和入参类型一致的能力,当我们想要输入的值类型和返回类型一致时可以使用
function getInputVal<T>(arg:T):T{
    console.log('arg: ', arg);
    return arg;
}
cons

泛型接口

  • 当我们调用函数想要返回值有多重类型时,可以使用接口定义的泛型来实现,作用的话其实和泛型函数一样都是为了提高可重用性。
interface Identities<V,M>{
    value:V;
    message: M;
}
const getMultiInputVal = <T,U>(value:T,message:U):Identities<T,U>=>{
    let identies:Identities<T,U> = {
        value,
        message
    }
    return identies
}

泛型类

  • 在类中使用泛型,可以帮助我们确认类的所有属性都在使用相同的类型。
class IdentitiesClass<T>{
    value:T;
    constructor(val:T){
        this.value = val
    }
    getIdentity(): T {
        return this.value
      }
}

泛型约束

  • 在使用泛型时有时我们需要定义的类型都有同一个属性,此时结合接口来进行yue 注:对typescript中类型的定义,个人觉的可以分成这几个等级的约束(由高到底): 指定类型=》联合类型 =》泛型约束 =》 泛型函数/接口/类 =》 泛型和联合类型组合=》 any,根据实际业务来使用typesript中类型定义也许刚开始会增加我们的开发时间但是长期来看不仅会使的我们的程序更为健壮也会缩短后期的维护成本。
// 泛型的约束: 定义我们传入的变量都具备length属性并且length属性都是number类型
interface LengthWise{
    length: number;
}
const identifyTypeWise =<T extends LengthWise>(arg:T):T=>{
    console.log('arg: ', arg);
    return arg
}
identifyTypeWise("test length") //字符串具备length,编译通过
identifyTypeWise(["test length"]) //数组具备length,编译通过
identifyTypeWise(3) //number类型不具备length,编译报错
// **.ts:58:18 - error TS2345: Argument of type 'number' is not assignable to parameter of type 'LengthWise'.

常用的内置泛型


Partial

  • Partial这个内置泛型是我最长用的一个,该工具类型能够构造一个新类型,并将实际类型参数T中的所有属性变为可选属性。
/**
 * @params 类型
 * @returns 新类型
 */
interface Student{
    name:string;
    weight: number;
    height: number;
    score: number;
}
const xmStu: Student = {
    name:"xm",
    weight: 133,
    height: 99,
    score: 122
}
type StudentPartial = Partial<Student>;
const xhStu:StudentPartial = {
    name: 'xh'
}

Required

  • 该工具类型能够构造一个新类型,并将实际类型参数T中的所有属性变为必选属(与partial的作用相反)
/**
 * 内置的泛型处理函数-Required
 * 
 * @params 类型
 * @returns 新类型
 */
type StudentRequired = Required<StudentPartial>
const xjStu:StudentRequired = {
    name: 'xj'
}
//类型“{ name: string; }”缺少类型“Required<Partial<Student>>”中的以下属性: weight, height, score, phonets(2739)
[查看问题]()
[快速修复... (Ctrl+.)]()
\

Record<Keys, Type>构造一个对象类型,Keys 表示对象的属性键 、Type 表示对象的属性值,用于将一种类型属性映射到另一种类型

  • 简单的限定键和值的类型
  • 基于其他类型生成新的类型
type Obj1 = Record<string, string>
type FruitTypes = 'apple' | 'banana' | 'pear'
type FruitsWeight = Partial<Record<FruitTypes, number>>
const fruits: FruitsWeight = {
  apple: 3,
  banana: 3,
  pear: 2
}

注:这个跟接口定义的约束类似直接写法更方便,约束性更强

Pick<Type,Keys>:挑取,

  • 该工具类型能够从已有对象类型中选取给定的属性及其类型,然后构建出一个新的对象类型,Pick<T, K>”工具类型中的类型参数T表示源对象类型,类型参数K提供了待选取的属性名类型,它必须为对象类型T中存在的属性。示例如下:
//接着Record的属性
type AppleWeight = Pick<FruitsWeight,'apple'>
const apple:AppleWeight = {
    apple:3
}

总结


学习新知识切勿死记硬背,应该学会从已有的知识中推导出新的知识,另外一定要把握好新知识能力对于自己当前的能力,循序渐进的去接触学习自己未掌握的知识。想要一口吃成个胖子是不现实的。


相关文章
|
6天前
|
云安全 监控 安全
|
3天前
|
存储 机器学习/深度学习 人工智能
打破硬件壁垒!煎饺App:强悍AI语音工具,为何是豆包AI手机平替?
直接上干货!3000 字以上长文,细节拉满,把核心功能、使用技巧和实测结论全给大家摆明白,读完你就知道这款 “安卓机通用 AI 语音工具"——煎饺App它为何能打破硬件壁垒?它接下来,咱们就深度拆解煎饺 App—— 先给大家扒清楚它的使用逻辑,附上“操作演示”和“🚀快速上手不踩坑 : 4 条核心操作干货(必看)”,跟着走零基础也能快速上手;后续再用真实实测数据,正面硬刚煎饺 App的语音助手口令效果——创建京东「牛奶自动下单神器」口令 ,从修改口令、识别准确率到场景实用性,逐一测试不掺水,最后,再和豆包 AI 手机语音助手的普通版——豆包App对比测试下,简单地谈谈煎饺App的能力边界在哪?
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1223 7
|
5天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
367 10
|
2天前
|
人工智能
自动化读取内容,不会写爆款的普通人也能产出好内容,附coze工作流
陌晨分享AI内容二创工作流,通过采集爆款文案、清洗文本、智能改写,实现高效批量生产。五步完成从选题到输出,助力内容创作者提升效率,适合多场景应用。
212 104
|
17天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
1194 43
|
17天前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
988 82
大厂CIO独家分享:AI如何重塑开发者未来十年
|
12天前
|
存储 自然语言处理 测试技术
一行代码,让 Elasticsearch 集群瞬间雪崩——5000W 数据压测下的性能避坑全攻略
本文深入剖析 Elasticsearch 中模糊查询的三大陷阱及性能优化方案。通过5000 万级数据量下做了高压测试,用真实数据复刻事故现场,助力开发者规避“查询雪崩”,为您的业务保驾护航。
590 32