2016-08-03 4 views
2

У меня есть объект 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? 
     }) 
    }); 
}); 

Есть ли способ, которым это возможно?

ответ

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.

0

runtime-types project выглядит многообещающим.

Из 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' } ] 
0

Я не знаю, почему люди не используют его больше, но joi фантастическая проверка формы и типа библиотека

Вы можете: прекратите любую форму объекта, а затем просто проверьте, какие объекты соответствуют. Если вы хотите, утверждение, как опыт, который вы можете сделать это, как этот

const schema = joi.object().keys({a:joi.string()}); 
joi.assert(myObj,schema,"error message") 
Смежные вопросы