Ts高级技巧总结

keyof

类似于Object.keys(),用于把interface的所有key以“或”的形式组成一个新的类型,类似于枚举类型

interface Point {
    x: number;
    y: number;
}
type PointKeys = keyof Point
const key: PointKeys = 'x' // key只能赋值'x'或者'y'

实例:实现一个get函数来获取object的属性值

function get<T extends Record<string, unknown>, K extends keyof T>(obj: T, key: K): T[K]{
    return obj[key]
}
// 提示:使用Record<string, unknow>代替object

Record

上面用到了Record,那么就先来看它吧,通常用在声明对象时进行类型指定,第一个参数是key的类型,第二个参数是值得类型。

const obj: Record<string, string> = {
    name: 'lisa'
}

Record实现:这里又用到了keyof

type Record<K extends keyof any, T> = {
    [P in K]: T
}

in

Record的实现中用到了in,in是与keyof相对应的,keyof是产生枚举类型,通过in可以遍历枚举类型

type Keys = 'a' | 'x' | 'y'
type Obj = {
    [k in Keys]: unknow
}
==相当于==> {a: unknow, x: unknow, y: unknow}

实例:提前看一下Partial源码

type Partial<T> = {
    [K in keyof T]?: T[K] 
}
const obj: Partial<Point> = {
    x: 1,
    y: 1
}
// 因为obj类型相当于{x?: number, y?: number}

Partial / Required / Readonly

说到Partial,从源码可以看出Partial用来将类型的所有属性变为可选属性。
与其对应的还有Required(将所有属性变成必选)

type Required<T> = {
    [K in keyof T]: T[K]
}

Readonly比较简单,就是把所有属性变成只读属性

type C = {
  x?: string
  y: string
  z: string
}
type aa = Readonly<C>
// 以上相当于:
type aa = {  
    readonly x?: string;  
    readonly y: string;  
    readonly z: string;  
}

实现:

type Readonly<T> = {
    readonly[K in keyof T]: T[K]
}

Pick / Omit

Pick:从接口中挑拣选择部分属性作为新的类型,第一个参数:原接口类型,第二个参数:要选择的属性

type obj = {
    a: number,
    b: number,
    x: number
}
const aa: Pick<obj, 'a'> = {
    a: 1, // 只能有a属性
}

实现:

type Pick<T, K extends keyof T> = {
    [P in K]: T[K]
}

Omit的作用是从接口中,忽略排除部分属性作为新的类型。这里使用到了Exclude。如下:变量aa使用Omit声明类型,结果为obj中除了'a'和'x',剩下属性=>{b: number}

type obj = {
    a: number,
    b: number,
    x: number
}
const aa: Omit<obj, 'a' | 'x'> = {
    b: 1,
}

实现:

type Omit<T, K> = Pick<T, Exclude<keyof T, K>>

Exclude / Extract

Exclude字面意思就是“排除”,从第一个参数类型中排除第二个参数中有的类型。

type A = 'x' | 'y'
type B = 'x' | 'y' | 'z'
type Oo = Exclude<B, A>
const str: Oo = 'z' // B的z类型在A中没有,所以Exclude<B, A>就相当于'z'
// const str: Oo = 'x' // 不可以赋值

实现:

type Exclude<T, U> = T extends U ? never  T

Extract和Exclude相对应,用于取交集,即两者都有的类型

type Ex = Extract<'id'|'name'|'age', 'id'|'ho'>
const obj: Ex = 'id'
const obj: Ex = 'ho' //报错

实现:

type Exclude<T, U> = T extends U ? T : never

NonNullable

把联合类型中的null和undefined去掉之后的新类型

type Test = number | null | undefined
type Non = NonNullable<Test> // 等价于 type Non = number

实现:

type NonNullable<T> = T extends null | undefined ? never  T

is类型保护

使用is可以做类型的保护,常见实例如,isXXX函数,判定一个变量是不是指定类型。

function isStr(val: unknown): val is string {
    return typeof val === 'string'
}
function fn(value: unknown){
    if(isStr(value)){
        console.log(value.length) // 这里value已经判定为string类型,所有不会报错
    }
}
fn(12)

如果不使用is,直接使用boolean

function isStr(val: unknown): boolean {
    return typeof val === 'string'
}
function fn(value: unknown){
    if(isStr(value)){
        console.log(value.length) // 这里会报错,因为value可能是unknow类型
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容