你能检查一个对象在运行时是否符合Flow类型吗?

时间:2016-08-03 12:52:13

标签: javascript unit-testing flowtype

我有一个正在解析的JSON对象,我正在为输出编写测试,我不能在运行时检查特定对象是否符合流类型。

main.cpp

这有什么办法可以实现吗?

4 个答案:

答案 0 :(得分:2)

如果你的意思是在运行时使用流程,答案肯定是否定的,流程是用ocaml写的。祝你好运从JavaScript中调用它。如果您的意思是验证对象属性的类型,答案大多数情况下是肯定的。您必须手动检查字段的类型。我会从这样的事情开始:

let expectedKeys = ['foo', 'bar', 'baz'].sort().toString();
expect(Object.keys(testObj).sort().toString()).toBe(expectedKeys);

确保对象具有正确的密钥。

然后,您必须检查这些键的值类型是否正确。对于内置插件,这很容易:

const _extractHiddenClass = (r => a => {
  return Object.prototype.toString.call(a).match(r)[1].toLowerCase();
})(/ ([a-z]+)]$/i);

_extractHiddenClass(/inrst/i); // regexp
_extractHiddenClass(true);     // boolean
_extractHiddenClass(null);     // null

等等。对于您通过构造函数new创建的类型,我使用:

const _instanceOf = (ctor, obj) => {
  return (obj instanceof ctor) || 
   (ctor.name && ctor.name === obj.constructor.name);
};

虽然这不是万无一失的,但它应该运作得很好。为了进行一些无耻的自我推销,我写了一个小库来处理很多这类东西,找到它here。同样在npm

答案 1 :(得分:2)

检查https://codemix.github.io/flow-runtime与JavaScript兼容的运行时类型系统。

答案 2 :(得分:1)

runtime-types project看起来很有希望。

来自README,

$(listOfElements).last().append(content);

example-types.js

// @flow export type PhoneNumber = string; export type User = { username: string; age: number; phone: PhoneNumber; created: ?Date; }

validator.js

答案 3 :(得分:0)

我不知道为什么人们不再使用它,但joi是一个很棒的形状和类型验证库

您可以定义任何对象形状,然后只检查哪些对象符合。如果你想要一个类似体验的断言,你可以这样做

const schema = joi.object().keys({a:joi.string()});
joi.assert(myObj,schema,"error message")