TypeScript中类型映射的使用

 更新时间:2023年10月27日 10:46:21   作者:海阔天空BM  
TypeScript中的映射类型和数学中的映射类似,能够将一个集合的元素转换为新集合的元素,本文就来介绍一下TypeScript中类型映射的使用,感兴趣的可以了解一下

1. 简介

映射就是将一种类型按照映射规则,转成另一种类型,通常用于对象类型。

这里类型B通过A采用属性名索引的写法,完成了类型B的定义

type A = {
  foo: number;
  bar: number;
};

type B = {
  [prop in keyof A]: string;
};

这里复制了一个一样的类型,类型B原样复制了类型A

type A = {
  foo: number;
  bar: string;
};

type B = {
  [prop in keyof A]: A[prop];
};

为了增加代码复用性,可以把常用的映射写成泛型。

这里定义了一个泛型,可以将其他对象的所有属性值都改成 boolean 类型。

type ToBoolean<Type> = {
  [Property in keyof Type]: boolean;
};

不使用联合类型,直接使用某种具体类型进行属性名映射,也是可以的。

type MyObj = {
  [p in 'foo']: number;
};

// 等同于
type MyObj = {
  foo: number;
};

上面示例中,p in 'foo'可以看成只有一个成员的联合类型,因此得到了只有这一个属性的对象类型。

通过映射,可以把某个对象的所有属性改成可选属性。比如ts 的内置工具类型Partial<T>,就是这样实现的。

type A = {
  a: string;
  b: number;
};

type B = {
  [Prop in keyof A]?: A[Prop];
};

上面示例中,类型B在类型A的所有属性名后面添加问号,使得这些属性都变成了可选属性。

ts内置的工具类型Readonly<T>可以将所有属性改为只读属性,实现也是通过映射。

// 将 T 的所有属性改为只读属性
type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};
// 用法如下。
type T = { a: string; b: number };

type ReadonlyT = Readonly<T>;
// {
//   readonly a: string;
//   readonly b: number;
// }

2. 映射修饰符

映射会原样复制原始对象的可选属性和只读属性,如果想要删除可选和只读这两个特性,并不太方便,所以为了解决这个问题,ts引入了两个修饰符,用来移除映射时添加或移除可选属性或者只读属性。

  • +修饰符:写成+?+readonly,为映射属性添加?修饰符或readonly修饰符。
  • 修饰符:写成-?-readonly,为映射属性移除?修饰符或readonly修饰符。

这里添加、移除了可选属性,+?-?要写在属性名的后面

// 添加可选属性
type Optional<Type> = {
  [Prop in keyof Type]+?: Type[Prop];
};

// 移除可选属性
type Concrete<Type> = {
  [Prop in keyof Type]-?: Type[Prop];
};

这里添加、移除只读属性,+readonly-readonly要写在属性名的前面。

// 添加 readonly
type CreateImmutable<Type> = {
  +readonly [Prop in keyof Type]: Type[Prop];
};

// 移除 readonly
type CreateMutable<Type> = {
  -readonly [Prop in keyof Type]: Type[Prop];
};

如果同时增删?readonly这两个修饰符,写成下面这样。

// 增加
type MyObj<T> = {
  +readonly [P in keyof T]+?: T[P];
};

// 移除
type MyObj<T> = {
  -readonly [P in keyof T]-?: T[P];
}

ts 原生的工具类型Required<T>专门移除可选属性,就是使用-?修饰符实现的。

另外,–?修饰符移除了可选属性以后,该属性就不能等于undefined了,实际变成必选属性了。但是,这个修饰符不会移除null类型。

另外,+?修饰符可以简写成?+readonly修饰符可以简写成readonly

3. 键名重映射

1. 语法

ts4.1引入了键名重映射,允许改变键名,就是在键名映射的后面加上as +新类型字句,新类型字句一般是模板字符串,用来对原键名的操作。

type A = {
  foo: number;
  bar: number;
};

type B = {
  [p in keyof A as `${p}ID`]: number;
};

// 等同于
type B = {
  fooID: number;
  barID: number;
};

上面示例中,类型B是类型A的映射,但在映射时把属性名改掉了,在原始属性名后面加上了字符串ID

可以看到,键名重映射的语法是在键名映射的后面加上as + 新类型子句。这里的“新类型”通常是一个模板字符串,里面可以对原始键名进行各种操作。

2. 属性过滤

键名重映射可以过滤某些属性。

3. 联合类型的映射

因为键名重映射可以修改键名类型,所以原始键名的类型不必是string|number|symbol,任意的联合类型都可以用来进行键名重映射。

type S = {
  kind: 'square',
  x: number,
  y: number,
};

type C = {
  kind: 'circle',
  radius: number,
};

type MyEvents<Events extends { kind: string }> = {
  [E in Events as E['kind']]: (event: E) => void;
}

type Config = MyEvents<S|C>;
// 等同于
type Config = {
  square: (event:S) => void;
  circle: (event:C) => void;
}

上面示例中,原始键名的映射是E in Events,这里的Events是两个对象组成的联合类型S|C。所以,E是一个对象,然后再通过键名重映射,得到字符串键名E['kind']

到此这篇关于TypeScript中类型映射的使用的文章就介绍到这了,更多相关TypeScript 类型映射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用JavaScript平移和缩放图像的示例代码

    使用JavaScript平移和缩放图像的示例代码

    平移和缩放是查看图像时常用的功能,我们可以放大图像以查看更多细节,进行图像编辑,Dynamsoft Document Viewer是一个用于此目的的SDK,它为文档图像提供了一组查看器,在本文中,我们将演示如何使用它来平移和缩放图像,需要的朋友可以参考下
    2024-08-08
  • 微信小程序实现搜索功能并跳转搜索结果页面

    微信小程序实现搜索功能并跳转搜索结果页面

    本文主要介绍了微信小程序实现搜索功能并跳转搜索结果页面,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • js点击页面其它地方将某个显示的DIV隐藏

    js点击页面其它地方将某个显示的DIV隐藏

    今天一朋友问我 点击一按钮弹出一个DIV,然后要求点击页面其它地方隐藏这个DIV
    2012-07-07
  • js中各种数据类型检测和判定的实战示例

    js中各种数据类型检测和判定的实战示例

    typeof一般被用于判断一个变量的类型,我们可以利用typeof来判断number,string,object,boolean,function,undefined,symbol这七种类型,下面这篇文章主要给大家介绍了关于js中各种数据类型检测和判定的相关资料,需要的朋友可以参考下
    2022-11-11
  • 微信小程序webSocket的使用方法

    微信小程序webSocket的使用方法

    这篇文章主要介绍了微信小程序webSocket的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • JavaScript兼容性总结之获取非行间样式案例

    JavaScript兼容性总结之获取非行间样式案例

    这篇文章主要介绍了JavaScript兼容性总结之获取非行间样式的相关资料,需要的朋友可以参考下
    2016-08-08
  • js 自带的sort() 方法全面了解

    js 自带的sort() 方法全面了解

    下面小编就为大家带来一篇js 自带的sort() 方法全面了解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • javascript定时器的简单应用示例【控制方块移动】

    javascript定时器的简单应用示例【控制方块移动】

    这篇文章主要介绍了javascript定时器的简单应用,结合javascript事件触发控制方块移动操作分析了javascript定时器使用相关操作技巧,需要的朋友可以参考下
    2019-06-06
  • JavaScript面试出现频繁的一些易错点整理

    JavaScript面试出现频繁的一些易错点整理

    通过几个常见面试开始,讨论针对一个题目的分析思路,就有了下面这篇文章,本文主要给大家整理总结介绍了关于JavaScript面试中会频繁出现的一些易错点,对大家具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。
    2018-03-03
  • JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】

    JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】

    这篇文章主要介绍了JS图片延迟加载插件LazyImgv1.0用法,结合实例形式分析了使用图片延迟加载插件LazyImgv1.0的注意事项与核心操作技巧,并附带demo源码供读者下载参考,需要的朋友可以参考下
    2017-09-09

最新评论