TypeScript进阶类型

TypeScript学习-进阶1

1.数据转换

在工作或学习过程中,经常会遇到数据类型不完全匹配的情况,例如从后端返回的数据类型,部分类型并不满足前端的需要,会导致后端写一份类型,前端还要重写一遍类型,导致冗余类型过多
例如:

// 假设后端的数据类型为:
type ProductBody = {
  height:number,
  width:number,
  weight:number,
}

type ProductTest = {
  test1?:string,
  test2:number,
  test3:number,
}

type ProductInfo = {
  id?:number,
  name:string,
  num:number, //编号
  count:number,
  price:number,
  body:ProductBody[],
  month?:string,
  test:ProductTest 
}

需要通过一个方式,获得如下类型:

// 假设后端的数据类型为:
type ProductBodyForView = {
  height:number | null,
  width:number | null,
  weight:number | null,
}

type ProductTestForView = {
  test1:string,
  test2:number,
  test3:number,
}

type ProductInfoForView = {
  id?:number,
  name:string,
  num:number | null, //编号
  count:number | null,
  price:number | null,
  body:ProductBodyForView[],
  month:string,
  test:ProductTestForView,
}

那么如何将ProductInfo类型转为ProductInfoForView这样的类型呢?首先可以分析一下,数据结构中所有的number类型都转为了number | null,先完成这一步:

/** 将所有的 number/number | undefined类型转为 number | null/number | undefined | null */
export type ToNumberOrNull<T> = {
  [P in keyof T]: T[P] extends number ? number | null :
  T[P] extends number | undefined ? number | null | undefined :
  T[P]
}

做完这一步之后,我们已经可以将number类型都转为了number | null,然后再分析一下,我们还需要将ProductInfo这个类型中的body转为ProductBodyForView ,test这个类型转为ProductTestForView,当然可以这样来转:

type ProductInfoForView = Omit<ProductInfo,'body' | 'test'> & {
  body:ProductBodyForView[],
  test:ProductTestForView
}

这样当然是ok的,但这只是有两个key的类型需要转换,那么如果有10个key,就要Omit<ProductInfo,‘xx’ | ‘xx’ …> & {xx:xx,xx:xx…},手写抽筋了!
那有没有办法能简写一点呢,有的:

// 核心
export type ParseData<T, K extends { [P in keyof K]: K[P] }> = {
  [M in keyof Required<T>]: M extends keyof K ? K[M] : T[M]
}

用法:

type ParseData = ParseData<ToNumberOrNull<Required<ProductInfo>>,{
  id?:number,
  body:ToNumberOrNull<ProductBody>[],
  test:ToNumberOrNull<ProductTest>,
}>

通过这样的转换 已经可以得到ProductInfoForView这个数据类型了,并且扩展性一定比Omit更好,快去试试吧

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
什么是TypeScriptTypeScript是JavaScript的加强版,它给JavaScript添加了可选的静态类型和基于类的面向对象编程,它拓展了JavaScript的语法。不过,你不必担心TypeScript跟浏览器不兼容,因为在编译时,它产生的都是JavaScript代码。为什么要学TypeScritpt?TypeScript是一门很有前景和钱景的语言;它能大幅的提高工作效率,并且减少错误;这堂课我们能学到什么?随着前端行业越来越受到重视,前端的逻辑也越来越复杂,对前端从业者的职业要求也越来越高,Vue、Angular、React和一些新的框架层出不穷,而作为Angular等框架的推荐语言TypeScript也在市场中得到了认可和追捧,不管是前端、还是游戏引擎、以及一些大型项目开发都中开始展露头角。但是这方面学习资源相对较少。课程特点:本堂课程通过深入浅出的讲解,幽默风趣的风格; 让大家在3个小时的课程中能够掌握大部分TypeScript的核心知识; 同时能够使用TypeScript进行React等框架的项目开发; 为大家的学习和在工作中使用TypeScript打下坚实的基础。课程大纲:1.TS的初步配置2.TS 数据类型 any 枚举3.函数的参数和返回值类型4.类非常重要 非常重要5.静态类属性和方法 Math6.泛型7.模块化 systemjs8.项目TS+react+webpack结合的工作流应类型管理 js->tsx 2.0如何用TS开发react->TSX(难点->官网 项目)工作流 package.json -> npm start npm run build 适用人群:1.Typescript零基础想掌握ts正确学习姿势和入门的初学者2.经验丰富的jser想拓宽自己知识掌握ES6和ES7新功能的从业者3.想在工作和项目中使用ts结合VAR框架的人员4.有志于成为全栈开发人员却苦于无法入门后端和跟后端沟通不畅的开发者5.想深入了解和使用angular的人员
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值