TypeScript 的实用类型笔记

发布于 2022-09-03 20:29:02 字数 3408 浏览 189 评论 0

Partial

将泛型 T 的所有属性变为可选:

实现为:

type Partial<T> = {
    [P in keyof T]?: T[P];
};

例子:

interface IGoods {
  sku: string
  name: string
  price: number
}


let book:Partial<IGoods> = {
  sku: 'abcd',
  name: 'huruji'
}

book.price = await getPrice(book.sku)

我们可以拓展一下,支持深层次的 partial

type DeepPartial<T> = {
  [P in keyof T]?: T[P] extends Array<infer U>
    ? Array<DeepPartial<U>>
    : T[P] extends ReadonlyArray<infer U>
      ? ReadonlyArray<DeepPartial<U>>
      : DeepPartial<T[P]>
}
interface IUser {
  user: {
    name: string,
    id: number
  }
}

let huruji:DeepPartial<IUser> = {
  user: {
    name: 'huruji'
  }
}

Readonly

将泛型 T 的所有属性变为只可读(readonly):

实现为:

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

例子:

function freeze<T>(obj:T):Readonly<T> {
  return obj
}

const user = freeze({
  name: 'huruji',
  age: 12
})

Record<K, T>

规定 key 的type

实现为:

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

例子:

type GoodProps = 'sku' | 'id' | 'name'

let iphone:Record<GoodProps, string> = {
  sku: 'f',
  id: 'a',
  name: 'd'
}

等同于定义的 interface:

interface IGoods {
  sku: string
  id: string
  name: string
}

Pick<T,K>

选取 T 的部分属性组成新的 type

实现为:

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

例子:

interface IGoods {
  sku: string
  id: string
  name: string
}

let airpod:Pick<IGoods, 'sku' | 'name'> = {
  sku: 'sdf',
  name: 'air'
}

Omit<T, K>

从类型 T 中忽略 K 属性,组成新的类型

实现为:

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

例子:
�pick 的例子等价于

interface IGoods {
  sku: string
  id: string
  name: string
}

let airpod:Omit<IGoods, 'id'> = {
  sku: 'sdf',
  name: 'air'
}

Exclude<T,U>

排除部分 T 的属性(Constructs a type by excluding from T all properties that are assignable to U.)

实现:

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

例子:

type GoodProps = 'sku' | 'id' | 'name'

type SubGoods = Exclude<GoodProps, 'name'>

let desk:Record<SubGoods, string> = {
  sku: '123',
  id: '456'
}

Extract<T, U>

T 和 U 取交集组成新的类型

实现:

type Extract<T, U> = T extends U ? T : never;

例子

type GoodProps = 'sku' | 'id' | 'name'

type People = 'age' | 'name'

let ex:Extract<GoodProps, People> = 'name'

NonNullable

从 T 中排除 null 和 undefind 类型

实现:

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

例子:

type Age = number | undefined | null

let userAge:NonNullable<Age> = 12

ReturnType

获得函数类型 T 的返回类型

实现:

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

例子:

type T0 = ReturnType<() => string>
let name:T0 = 'huruji'

Required

将 T 中所有可选属性转换为必须属性,是 Partial 的反操作

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

葵雨

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

遂心如意

文章 0 评论 0

5513090242

文章 0 评论 0

巷雨优美回忆

文章 0 评论 0

junpengz2000

文章 0 评论 0

13郎

文章 0 评论 0

qq_xU4RDg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文