你能在运行时检查一个对象是否符合Flow类型吗
Can you check if an object conforms to a Flow type at runtime?
我有一个正在解析的JSON对象,我正在为输出编写测试,但我无法在运行时检查特定对象是否符合流类型。
const object = {/**/}
type SomeType = {
foo: string,
bar: bool,
baz: Object,
}
describe('object', () => {
describe('.subfield', () => {
it('conforms to SomeType', () => {
// Here I want to write an 'expect'
// that checks if object.subfield
// conforms to the SomeType flow type?
})
});
});
有什么办法可以做到这一点吗?
如果您的意思是在运行时使用流,那么答案肯定是否定的,流是用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);
};
虽然这不是完全万无一失的,但它应该足够好用。为了一点无耻的自我推销,我写了一个小图书馆,处理很多这种东西,在这里找到它。也在npm上。
检查https://codemix.github.io/flow-runtime用于JavaScript的流兼容运行时类型系统。
运行时类型项目看起来很有前景。
从自述文件,
example-types.js
// @flow
export type PhoneNumber = string;
export type User = {
username: string;
age: number;
phone: PhoneNumber;
created: ?Date;
}
validator.js
var types = require('runtime-types')
var validate = require('runtime-types').validate
var MyTypes = types.readFile(path.join(__dirname, '../test/example-types.js'))
var VALIDATORS = {
PhoneNumber: validate.validateRegex(/^'d{10}$/),
}
var validators = validate.createAll(VALIDATORS, MyTypes)
var errs = validators.User({
age: 23,
phone: "8014114399"
})
// ==> [ { key: 'username', value: undefined, error: 'missing' } ]
我不知道为什么人们不更多地使用它,但joi是一个很棒的形状和类型验证库
您可以定义任何对象形状,然后只检查哪些对象符合。如果你想要一个类似断言的体验,你可以像这个一样做
const schema = joi.object().keys({a:joi.string()});
joi.assert(myObj,schema,"error message")
相关文章:
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 如何在DOM元素上按类型构建此函数
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 如何从querySelectorAll中获取按钮类型
- 如何在输入字段中的按钮的帮助下打开日历,该字段的类型为“=”;日期”;
- 如何将具有文本类型值的var放入jQuery函数中
- javascript解释器如何理解变量的数据类型
- 可变大小的JavaScript字符串如何成为基元类型
- 如何为排除无穷大和NaN的数字声明Flow类型
- Flow 的“JQuery Interface file”(来自 Facebook 的 JavaScript 静态类型检
- 在Flow中对内置类型进行子分类
- 替换Flow类型中对象属性的类型
- 对Flow中对包含可选参数的并集类型进行操作的函数进行注释
- 如何在不改变a的定义的情况下让Flow相信类型a是抽象类型B的子类型
- Flow:检查类型
- 在Flow中使用Promise作为返回类型
- 你能在运行时检查一个对象是否符合Flow类型吗
- 在Flow中使用什么来代替函数和对象类型