TS----之映射类型

偶然在知乎看到大佬的文章,特此记录,原文链接

https://zhuanlan.zhihu.com/p/620501674

映射类型

如果我们有多个Key值相同的类型,只是使用时的规定不一样(有时需要readonly),那么这时用映射类型进行复用type,既减少的代码量,又提高了阅读性

TS工具类型

平时开发时使用的工具类型还真的不多,正好借着这个机会学习,加深下印象

1.Partial<T>:将类型 T 中的所有属性变为可选属性

用法:

interface people  {
    name:string,
    age:number
}

function getName(user:people,updateName:Partial<people>){
    return{...updateName}
}

let a = getName({name:'uyyu',age:17},{age:88})

console.log(a);//{age:88}

2.Required<T>:将类型T中的所有可选属性变为必选属性.

用法同上

3.Pick<T,K>:,他可以将类型T中选择指定的属性K,生成一个新的属性。

实际上,就是用Pick从已有的type中,选择需要的属性生成一个新的type,避免代码冗余

用法


interface people  {
    name:string,
    age:number,
    tel:number,
    sex:string
}

type YY = Pick<people, 'name' | 'age'>

let a:YY = {name:'wangcai',age:18}

console.log(a);//{ name: 'wangcai', age: 18 }

4.Omit<T, K>:从类型 T 中删除指定的属性 K,生成一个新的类型。

用法同上

interface people  {
    name:string,
    age:number,
    tel:number,
    sex:string
}

type YY = Omit<people, 'name' | 'age'>//用Omit去掉了people中的name和age

let a:YY = {tel:3335,sex:'woman'}

console.log(a);//{ tel: 3335, sex: 'woman' }

当联合类型中,我们想操作一些属性的变化,也可以用Omit,实在想不到什么恰当的例子,随便写了写:

在联合类型User和Student中,去掉了公共的email属性,加上了sex和name属性,有点脱裤子放屁的感觉...

type User = {
    email:string,
    school:string,
    tel:number
}


type Student = {
    name:string,
    age:number,
    email:string
}

type People = Omit<User|Student,'email'> & {sex:string,name:string}

let yy:People = {
    sex:'woman',
    name:'yy'
}
console.log(yy);//{ sex: 'woman', name: 'yy' }

5.Record<K, T>: 它可以生成一个类型为 T 的对象,其中属性名的类型为 K

这个类型在开发中可以常用,写一写映射比较方便,划重点

type People = Record<string, number>

let a:People = {
    name:23243,
    age:9990,
    tel:130130
}




interface Animal{
    name:string,
    age:number,
    size:string
}

type Dog = Record<string,Animal>

let wangcai:Dog = {
    'dog':{
        name:'wangcai',
        age:18,
        size:'small'
    }
}

还有其他很多种工具类,其余的以后慢慢了解

像大佬一样使用映射类型

为什么要用映射类型

当我们已经有一个type,现在需要用到的类型,里面的属性和已有的type一样只是都为只读的,或者其他情况。怎样良好的对已有类型进行复用?

type User = {
    name:string;
    age:number;
    sex:string;
}
//现在只是想把User中的属性变成只读属性
type ReadonleUser = {
    readonly name:string;
    readonly age:number;
    readonly sex:string;
}
//现在只是想把User中的属性变成可选属性
type UserPartial = {
    name?:string;
    age?:number;
    sex?:string;
}

如果每次都要重新写一遍岂不是太冗余?于是这个时候就适合用到映射

如果只需要把type User中的每个属性,变成只读

其中的P in 相当于我们JS遍历对象中的for in

type User = {
    name:string;
    age:number;
    sex:string;
}
type ReadonlyUser = {readonly [P in keyof User] : User[P]}

let people:ReadonlyUser = {
    name:'yyh',
    age:33,
    sex:'woman'
}

那如果把type User中的属性都变成可选的,就简单了

type UserPartial = {[P in keyof User] ?: User[P]}
let people:UserPartial = {
    name:'yyh',
    sex:'woman'
}
console.log(people);//{ name: 'yyh', sex: 'woman' }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值