即使使用if / else,联合类型的流也会失败

时间:2016-10-25 11:09:07

标签: flowtype

在流程documentation中,它说明了typeof"此类型测试与联合类型结合使用特别有用。"然而,以下内容并没有通过流&的镰刀:

var EventEmitter = require('events').EventEmitter;
var fnify = function(key: string | (x: number, y: any) => string) {
    var fnkey = typeof(key) === 'function' ? key : (t) => key;
    new EventEmitter().emit(fnkey(0), 0);
}

Flow抱怨它不知道fnkey的返回值,这是奇数,因为它保证是来自函数签名的字符串。经历的是:

var EventEmitter = require('events').EventEmitter;
var fnify = function(key: string | (x: number, y: any) => string) {
    var fnkey = typeof(key) === 'function'
        ? key
        : (t) => typeof(key) === 'string' ? key : null;
    var kludge = fnkey(0);
    if (kludge) {
      new EventEmitter().emit(kludge, 0);
    }
}

但后者似乎不必要地冗长。这是一个功能吗?错误?第一个片段是否有什么问题导致流量激增?

1 个答案:

答案 0 :(得分:0)

问题是key可以在函数体中更改,使用const binding

var EventEmitter = require('events').EventEmitter;
var fnify = function(key: string | (x: number, y: any) => string) {
  const k = key;
  var fnkey = typeof(k) === 'function' ? k : (t) => k;
  new EventEmitter().emit(fnkey(0), 0);
}

或在experimental.const_params=true

[option]部分设置.flowconfig