簡體   English   中英

你能檢查一個對象在運行時是否符合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?
        })
    });
});

有什么方法可以實現嗎?

如果你的意思是在運行時使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM