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

Javascript 如何为用作排除函数的映射的对象声明流类型,javascript,types,flowtype,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 /* @flow */ const a = { 'foo': {}

函数与
{}
类型兼容:

/* @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
/* @flow */
const a = { 'foo': {} }
const b = () => true;

(a: { $call?: empty, [string]: {} });  // No errors! Cool, I like it
(b: { $call?: empty, [string]: {} });  // Errors, woohoo!
是否可以以某种方式排除函数,但允许使用字典


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

/* @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
/* @flow */
const a = { 'foo': {} }
const b = () => true;

(a: { $call?: empty, [string]: {} });  // No errors! Cool, I like it
(b: { $call?: empty, [string]: {} });  // Errors, woohoo!
这是由于流的内部函数定义而起作用的。为了进行解释,我将演示如何通过赋予对象一个
$call
属性将其分配给函数类型:

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