[英]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?
})
});
});
有什么方法可以實現嗎?
如果你的意思是在運行時使用 flow,答案肯定是no,flow是用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);
};
雖然這不是完全萬無一失的,但它應該運作得很好。 為了進行一些無恥的自我推銷,我寫了一個小庫來處理很多這類東西,在這里找到它。 也在上午 。
檢查https://codemix.github.io/flow-runtime用於JavaScript的與流兼容的運行時類型系統。
運行時類型項目看起來很有希望。
從README,
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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.