2016-08-03 73 views
2

我有一個正在被解析的JSON對象,並且正在編寫輸出的測試,並且我無法在運行時檢查特定對象是否符合流類型。你可以在運行時檢查對象是否符合Flow類型?

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看起來很有希望。

自述,

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是一個夢幻般的形狀和類型的驗證圖書館

你可以de罰款任何物體的形狀,然後檢查哪些物體符合。如果你想般的體驗斷言,你可以做這樣的

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