如何在流程中使用泛型对象休息?

时间:2017-07-24 22:21:56

标签: javascript generics types flowtype

我正在使用flow并且有一个接受对象的函数,并返回一个数组,该数组根据该对象的属性将该对象拆分为两个对象。

此函数的定义如下所示:

function split({ foo, bar, ...params }) {
  return [
   { foo, bar },
   params
  ]
}

并将像这样使用:

split({ foo: 123, bar: 456, baz: 'abc' }) // [{ foo: 123, bar: 456 }, { baz: 'abc' }]

我不确定如何为foobar是常量的已知属性添加此函数的流定义,params是通用的类型可以是任何东西。

我目前的尝试如下:

type FooBar = { foo: number, bar: number }

function split<T>({ foo, bar, ...params }: FooBar & T): [FooBar, T] {
  return [
   { foo, bar },
   params
  ]
}

但是,flow将返回数组的第二个元素解释为仍具有最初传入的所有属性。我怎么告诉flow第二个元素只有AREN&#39; T foo和bar的属性?

1 个答案:

答案 0 :(得分:1)

这应该适合你:

type FooBar = { foo: number, bar: number };

function split<T: FooBar>({ foo, bar, ...params }: T): [FooBar, $Diff<T, FooBar>] {
  return [
   { foo, bar },
   params
  ];
}