在流对象类型中覆盖单个字段类型的通用方法

时间:2017-08-01 04:28:17

标签: javascript types flowtype

给定类型

type X = {|
  a: number,
  b: number,
|};

我希望能够将其任何字段映射到另一种字段。例如,

type Y = {|
  a: string,
  b: number,
|};

type Y = {|
  a: number,
  b: any,
|};

我尝试了以下内容:

type Overwrite<O: Object, K: $Keys<O>, T> =
  {...O, [K]: T}

type X = {|
  a: number,
  b: number,
|};
type Y = Overwrite<X, 'a', string>;

const y: Y = {
  a: '12',
  b: 12,
}
乍一看似乎有效,但后来我意识到它也会被b覆盖,a可能仍然是number

const y: Y = {
  a: 1,
  b: '1',
}

有没有办法实现我想要做的事情?

1 个答案:

答案 0 :(得分:2)

您可以使用对象传播和确切类型覆盖:

type Overwrite<O, T> =
  {...O, ...T}

type X = {|
  a: number,
  b: number,
|};
type Y = Overwrite<X, {| a: string |}>;

const y: Y = {
  a: '12',
  b: 12,
}

// $ExpectError
const z: Y = {
  a: 1,
  b: '1',
}