如何为用作排除函数的映射的对象声明Flow类型

时间:2017-08-12 17:58:05

标签: javascript types flowtype

功能与{}类型兼容:

/* @flow */
const a = { 'foo': {} }
const b = () => true;

(a: {[string]: {} });  // No errors! Cool, I like it
(b: {[string]: {} });  // No errors! Not cool, I don't want functions to pass validation

是否有可能以某种方式排除函数但允许字典?

Try Flow example

1 个答案:

答案 0 :(得分:1)

这是有效的,因为函数在技术上是有效的对象。但是,你可以通过一些黑客来解决这个问题:设置一个可选属性$call并给它一个empty类型:

/* @flow */
const a = { 'foo': {} }
const b = () => true;

(a: { $call?: empty, [string]: {} });  // No errors! Cool, I like it
(b: { $call?: empty, [string]: {} });  // Errors, woohoo!

由于Flow的函数内部定义,这是有效的。为了解释,我将展示如何通过赋予$call属性将对象分配给函数类型:

/* @flow */
const obj = { $call: () => { console.log('wat'); } };
(obj: Function)  // No errors