TS类型定义中的+-符号
你是不是也经常在库源中看见泛型定义的 +- 加减符号,比如下面 Required 源码。这篇文章就来简单解释一下一脸懵逼的你。
/**
* Make all properties in T required
*/
type Required<T> = {
[P in keyof T]-?: T[P];
};
+ -符号在TS中的作用
在TS中我们可以使用 ? 修饰参数为可选参数。其实 ?的前面默认是带有 +号的。现在我们可以把 +号加上去
type MapInfo<T> = {
readonly [Property in keyof T]?: T[Property]
}
interface Info {
name: string
age: number
height: number
address: string
}
// {readonly name?: string, readonly age?: number, readonly height?: number, readonly address?: string}
type IPersonOptional = MapInfo<Info>
type MapInfo<T> = {
readonly [Property in keyof T]+?: T[Property]
}
interface Info {
name: string
age: number
height: number
address: string
}
// {readonly name?: string, readonly age?: number, readonly height?: number, readonly address?: string}
type IPersonOptional = MapInfo<Info>
可以发现两者之间 IPersonOptional 类型并没有什么区别。
现在我们把 -号加上去。
type MapInfo<T> = {
readonly [Property in keyof T]-?: T[Property]
}
interface Info {
name: string
age: number
height: number
address: string
}
// {readonly name: string, readonly age: number, readonly height: number, readonly address: string}
type IPersonOptional = MapInfo<Info>
可以发现两者之间 IPersonOptional 类型变为了必选参数。
何时在TS中使用 + -符号
我们看看这样的一种情况, 我们需要把这样一钟类型转化去掉 readonly 和 ? 改为可以修改的必选参数
interface Info {
name: string
age?: number
readonly height: number
address?: string
}
type MapInfo<T> = {
-readonly [Property in keyof T]-?: T[Property]
}
// {name: string, age: number, height: number, address: string}
type IPersonOptional = MapInfo<Info>
现在 IPersonOptional 的类型就 变为了以下类型,非常方便。