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