TypeScript对优化代码最有用的几个工具类型(Utility Type)

选中文字可对指定文章内容进行评论啦,绿色背景文字可以点击查看评论额。

TypeScript提供了好几个工具类型,它们主要用于常见的类型转换。这里介绍让代码优化非常有用的几个工具类型:Partial,Required,Record,Pick,Omit和Exclude。

Partial

Partial顾名思义,取部分。它的作用是把已有类型里的所有属性变为可选。

示例

interface User{
  id:number;
  name:string;
  atavarUrl: string;
  about: string
}

如我们已经定义了User类型,在定义时User类型的所有属性都是必选的。有一个功能,只需更新User的“关于”介绍,但又不想新增一个interface,把其他属性去掉。或者修改User interface,把其他属性改为可选,这样做可能会影响其他地方的使用。此处Partial就大有用处了,它可以把User的所有属性转换为可选:

const updateAbout = Partial<User> {
  about: "帅哥一枚"
}

Required

Required和Partial相反,它是类型的所有属性都设置为必选。这样有助于检查必选值是否赋值了。

示例

interface User  {
  firstName: string;
  lastName?: string;
}

定义的User,lastName是可选的,为了让调用者显式知道所有属性必选赋值,Required就可以上场了。

const user = Required<User> {
  firstName: ‘四’,
  lastName: ‘李’
}

Record

Record构造了一个key-value的关系,可以把一个类型的值映射为另一个类型的值。

示例

构造一个由用户名到用户信息的Record。

interface UserProfile {
   age: number;
   company: string
}
type UserName = “zhangsan” | ”lisi“ | “wangwu”;

const users : Record<UserName, UserProfile> = {
  “zhangsan”: {age: 23, company: ‘ACompany’},
  “lisi”: {age: 22, company: ‘ACompany’},
  “wangwu”: {age: 22, company: ‘BCompany’},
}

Pick

Pick工具类型可以从一个已有的类型,挑选部分属性来创建一个新的类型。

例如:

从一个总括的类型抽取部分属性作为简要类型的属性。

interface User {
    id: number;
    name: string;
    age: number;
    company: string;
}

type UserPreview = Pick<User, "id"|"name">
const userPreview: UserPreview = {
   id: 1,
   name: "张三"
}

Omit

Omit工具类型是从已有的对象类型中指定移除的属性后创建一个新的对象属性。这也正好和Pick相反。

上面构造的UserPreview示例,使用Omit实现:

type UserPreview = Omit<User, "age"|"company">
const userPreview: UserPreview = {
   id: 1,
   name: "张三"
}

Exclude

在使用UnionType时,有些情况下是不希望已有的UnionType的所有成员,所以可以使用Exclude把部分UnionType的部分成员排除。

type T0 = Exclude<"a" | "b" | "c", "a">;
type T0 = "b" | "c"  //排除了a
type T1 = Exclude<"a" | "b" | "c", "a" | "b">;
type T1 = "c"  //排除了a,b
type T2 = Exclude<string | number | (() => void), Function>;
type T2 = string | number   //排除了函数类型

 

版权声明:著作权归作者所有。

相关推荐

TypeScript:基本类型详解

布尔值(Boolean)TypeScript的布尔值和JavaScript一样有两个值:true和false。类型标识:boolean示例:let isDone: boolean = false; 数字(Number)和JavaScript一样,TypeScript的所有数字都是用浮点数表示,支持二进制,八进制,十进制以及十六进制的表示方式,类型标识:num

[译]代码优先的Java 9模块系统教程(一)

Java平台模块系统(JPMS)将模块化带入Java和JVM,并改变了我们在大型应用中的编程方式。 为了充分利用它,我们需要很好地了解,第一步是学习基础知识。 在本教程中,我首先向你展示一个简单的Hello World示例,然后我们用Java 9将一个现有的demo程序模块化。我们将创建模块声明(module-info。java),使用模块路径来编译,打包,

[译]代码优先的Java 9模块系统教程(二)

服务监控(ServiceMonitor)让我们来想象一个提供娱乐服务的网络,可能是社交网络或者是视频网络。我们希望监控这些服务,以确定系统的健康状况,并且在发生问题时能够发现,而不是客户报告。 这就是ServiceMonitor示例程序所要做的:监视这些服务(另一个惊喜)。幸运的是,服务已经收集了我们想要的数据,ServiceMonitor所需要做的就是定期查询。 不幸的是,并

使用sdkmanager命令行工具安装Android SDK

在使用持续集成工具(如jenkins,travis ci)对android做自动部署时,我们不能像在Android Studio那样使用SDK Manager的GUI界面来安装Android SDK。这种情况下,我们需要使用android命令行工具或者sdkmanager命令行工具来管理Android SDK。这里介绍一下sdkmanager命令行

Python3.4 枚举类型的使用

枚举类型是在Python3.4新增到Python的标准库。创建枚举Python提供了两种方法来创建枚举:基于class语法创建枚举基于Function API创建枚举创建枚举首先要导入Enum类>>> from enum import Enum 基于class语法创建枚举示例>>> from 

Python:有关IntEnum类型的比较

枚举类型的使用请参考:Python3.4 枚举类型的使用。我们在使用Enum定义枚举类型,枚举的成员不是整型,所以在做比较时不能使用如大于号(">"),小于号(“<”)作比较。只用做相等性比较。但直接和整型做相等比较,结果都为False。Python新增了IntEnum,IntEnum是允许和整型做比较,包括大小比较和值得相等比较。创建IntEnum定义I

有用的Kotlin版Rx代码片段1

只是几个随机的,可能有用的Rx片段(kotlin版)。计时器是的,只是一个简单的计时器,运行5秒。Observable.interval(1, TimeUnit.SECONDS, Schedulers.newThread())         .take(5)    &

[译]我希望在开始编码时就已知道的工具

在科技领域,有数千种工具可供人们使用。你怎么知道从哪里开始?就像最近开始编码的人一样,这种倾盆大雨的信息太多了,无法筛选出来。 我发现自己安装了扩展,在我的开发周期中并没有真正帮助我,并且通常甚至阻碍了它。我绝不是专家,但随着时间的推移,我编制了一份已证明对我非常有用的工具清单。 如果你刚刚开始学习编程,这将有望为你提供一些指导。 如果你是一位经验丰富的开发人员,希望

一些有用的pandas代码片段

# 列出dataframe指定列的唯一值 df['Column Name'].unique() # 把列的数据类型转换为数字。如果有非数字值,则会出错。 pd.to_numeric(df['Column Name']) # 把列的数据类型转换为数字,如果非数字值,则会转换为NaN pd.to_numeric(df['Column Na

Paramiko Python远程连接工具

Paramiko是一个Python的远程操作库,可以进行SSH, SFTP等远程连接操作. 来学习学习怎么使用吧python3 -m pip install paramiko 开始使用 导入paramikoimport paramiko 初始化SSHClientclient = paramiko.SSHClient()client.set_missing_host_key_policy(par