如何使用其他属性扩展Flow函数类型

时间:2017-10-30 20:22:25

标签: javascript types flowtype

Flow v0.57

我想定义两种功能类型var sender:[bob, sally, syke, lucy, larry,]; Foo来帮助键入以下模式:

FancyFoo

第一种功能类型似乎很简单:

const fooFn = () => ({ id: '...', type: '...' });

fooFn['HELLO'] = 'WORLD';
fooFn['test'] = () => {};

...

// now I can do this:
fooFn();
fooFn.HELLO;
fooFn.test();

我很难搞清楚第二个问题。我不清楚如何构建函数类型。

我尝试使用了交集:

type Foo = () => {
  id :string,
  type :string
}

然而,这种方法失败了:

type FancyFoo = Foo & {
  HELLO :string,
  test :() => mixed
}

如何定义// Errors: 2: type FancyFoo = Foo & { ^ property `HELLO` of object type. Property not found in 7: const fooFn :FancyFoo = () => ({ id: '...', type: '...' }); ^ function 2: type FancyFoo = Foo & { ^ property `test` of object type. Property not found in 7: const fooFn :FancyFoo = () => ({ id: '...', type: '...' }); ^ function 函数类型"扩展" FancyFoo还包括额外的属性?

Link to Flow Try

更新

以下是我尝试做的更具体的例子:

Foo

type Foo = () => { id :string, type :string } export function getFancyFoo(type :string) :FancyFoo { const id :string = randomId(); const foo :Foo = getFoo(id, type); ['A', 'B', 'C'].forEach((thing :string) => { foo[thing.toUpperCase()] = thing.toUpperCase(); foo[thing.toLowerCase()] = () => { /* function that does fancy thing */ }; }); return foo; } 函数将首先获得getFancyFoo函数,然后使用额外属性修饰/增强它。在功能结束时,Foo将如下所示(Chrome开发工具):

FancyFoo example

foo是一个FancyFoo函数,但它还添加了额外的属性。我坚持定义Foo函数类型。

1 个答案:

答案 0 :(得分:0)

使用Callable Object语法,例如

type OutputInterceptorType = {|
  <T>(routine: () => Promise<T> | T): Promise<T>,
  output: ''
|};