一脸懵逼的TS类型定义中的+-符号

386 阅读1分钟

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 的类型就 变为了以下类型,非常方便。 IPersonOptional