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
还包括额外的属性?
更新
以下是我尝试做的更具体的例子:
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开发工具):
foo
是一个FancyFoo
函数,但它还添加了额外的属性。我坚持定义Foo
函数类型。
答案 0 :(得分:0)
使用Callable Object语法,例如
type OutputInterceptorType = {|
<T>(routine: () => Promise<T> | T): Promise<T>,
output: ''
|};