我可以创建自定义动态类型测试吗?

时间:2016-12-20 03:19:38

标签: javascript flowtype

我正试图用Facebook的Flow类型检查器来解决问题。

说我有以下代码,一切正常:

function isGreaterThan5(x : string | number) {

    if (typeof x === 'string') {
        return parseInt(x) > 5;
    }

    return x > 5;
}

因为流dynamic type tests识别typeof支票。

然而 - 如果我稍微重构这段代码并打破typeof检查,它就会失败:

function isString(y) {
  return typeof y === 'string';
}

function isGreaterThan5(x : string | number) {

    if (isString(x)) {
        return parseInt(x) > 5;
    }

    return x > 5;
}

是否有可能以某种方式将我的isString函数标记为验证特定类型的纯函数?像

function isString(y) { /* typecheck string */
  return typeof y === 'string';
}

还是什么?

这看起来很有必要的另一个原因是例如检查,当从不同的框架中检查对象时,这会产生意外的结果:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof#instanceof_and_multiple_context_(e.g._frames_or_windows)

因此有时需要将这些检查抽象为辅助函数,如上所述,Flow似乎并不尊重......

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

Officially Flow不支持自定义谓词,但自定义谓词(实验和未记录)的语法是:

// I'm using a comment containing the type here because otherwise babel throws
function isString(y)/*: boolean %checks */ {
  return typeof y === 'string'
}

function isGreaterThan5(x: string | number) {
  if (isString(x)) {
    return parseInt(x) > 5
  }
  return x > 5
}