2016-08-03 5 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は素晴らしい形や種類の検証でありますライブラリ

オブジェクトの形状を細かくし、どのオブジェクトが適合しているかを確認するだけです。あなたが経験のような主張をしたい場合は、JavaScriptのために、この

const schema = joi.object().keys({a:joi.string()}); 
joi.assert(myObj,schema,"error message") 
関連する問題