我正试图用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似乎并不尊重......
提前感谢您的帮助!
答案 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
}