2017-07-24 38 views
1

我正在使用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 
    ] 
} 

然而,流解释在返回的数组的第二个元素作为静止具有最初通过了所有属性。我如何判断第二个元素只有属性不是foo和bar?

回答

1

这应该为你工作:

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

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

嗯,也许我误解这句法:''但我认为这将意味着'T'被赋予一个类型FooBar'的'所以就没有有效如果我们已经将'foo'和'bar'解构出来的话,params可能就会变成这样的值。 – arahansen

+0

在这种情况下'FooBar'不是一个确切的类型。这意味着输入参数符合形状'{foo:number,bar:number}'。在这种情况下,一个例子“{foo:number,bar:number,baz:string}”正确地符合定义为“T”的形状。 –

相关问题