精炼原始检查器
构建一个 精炼检查器 的起点是使用原始组合器。
这些是初始构建块,可以使用集合或其他自定义组合器组合成更高阶的组合器。
bool()
将值验证为一个 boolean
// define checker
const check = bool();
// test a value
const result = check(false);
assert(result.type === 'success');
// result should typecheck
const value: boolean = result.value;
// test an invalid value
const failedResult = check(1);
assert(failedResult.type === 'failure');
number()
将值验证为一个 number
// define checker
const check = number();
// test a value
const result = check(1);
assert(result.type === 'success');
// result should typecheck
const value: number = result.value;
// test an invalid value
const failedResult = check(false);
assert(failedResult.type === 'failure');
string()
将值验证为一个 string
// define checker
const check = string();
// test a value
const result = check('test');
assert(result.type === 'success');
// result should typecheck
const value: string = result.value;
// test an invalid value
const failedResult = check(false);
assert(failedResult.type === 'failure');
string
也可以接受正则表达式参数进行验证。
// define checker
const check = string(/^users?$/);
// test a value
const result = check('user');
assert(result.type === 'success');
// result should typecheck
const value: string = result.value;
// test an invalid value
const failedResult = check('buser');
assert(failedResult.type === 'failure');
literal()
将值验证为给定文字类型
// define checker
// note: to get Flow to use the literal, we must annotate
const check = literal<'add_todo'>('add_todo');
// can also use for null/undefined/true/false literals
const checkExactlyNull = literal<null>(null);
// test a value
const result = check('add_todo');
assert(result.type === 'success');
// result should typecheck
const value: 'add_todo' = result.value;
// test an invalid value
const failedResult = check('remove_todo');
assert(failedResult.type === 'failure');
stringLiterals()
检查器,用于断言混合值是否与字符串文字的并集匹配。合法值以对象中的键值对形式提供,可以通过在对象中提供不同的值来进行翻译。
const suitChecker = stringLiterals({
heart: 'heart',
spade: 'spade',
club: 'club',
diamond: 'diamond',
});
const suit: 'heart' | 'spade' | 'club' | 'diamond' = assertion(suitChecker())(x);
date()
将值验证为 javascript Date
对象
// define checker
const check = date();
// test a value
const result = check(new Date());
assert(result.type === 'success');
// result should typecheck
const value: Date = result.value;
// test an invalid value
const failedResult = check(1);
assert(failedResult.type === 'failure');
jsonDate()
类似于日期,但也会隐式地将 ISO 日期字符串强制转换为 Date 对象。当在 JSON 之间进行序列化时,这特别有用。
// define checker
const check = jsonDate();
// test a value
const result = check((new Date()).toString());
assert(result.type === 'success');
// result should typecheck
const value: Date = result.value;
// test an invalid value
const failedResult = check(1);
assert(failedResult.type === 'failure');
mixed()
占位符/默认检查器,允许跳过某些值的检查。始终成功。
// define checker
const check = mixed();
// test a value
assert(check(new Date()).type === 'success');
assert(check(1).type === 'success');
assert(check('test').type === 'success');
如果您想跳过检查某些未知值,这可能会有用...
// if we don't want to check below a certain level of an object...
const Request = object({
code: number(),
url: string(),
params: mixed(), // don't care what this is
});
nullable()
创建一个给定检查器的可空版本
// define checker
const check = nullable(string());
// result type of checking a value is a nullable string
const result: ?string = check(null);
// test a value
assert(check('test').type === 'success');
assert(check(null).type === 'success');
assert(check(1).type === 'failure');
默认情况下,传递给可空的 value 必须与检查器规范完全匹配,当它不为 null 时,否则它将失败。
传递 nullWithWarningWhenInvalid
选项可以实现对不太重要的无效值的优雅处理。如果提供的检查器将结果标记为无效,则新的检查器将返回 null。
例如
const Options = object({
// this must be a non-null string,
// or Options is not valid
filename: string(),
// if this field is not a string,
// it will be null and Options will pass the checker
description: nullable(string(), {
nullWithWarningWhenInvalid: true,
})
})
const result = Options({filename: 'test', description: 1});
assert(result.type === 'success');
assert(result.value.description === null);
// there will be a warning
assert(result.warnings.length === 1);
voidable()
类似于 nullable
,创建一个给定检查器的版本,该版本返回 T | void
。
// define checker
const check = voidable(string());
// test a value
assert(check('test').type === 'success');
assert(check(null).type === 'failure');
assert(check(undefined).type === 'success');
assert(check(1).type === 'failure');
默认情况下,传递给可空的 value 必须与检查器规范完全匹配,当它不为 undefined 时,否则它将失败。
传递 undefinedWithWarningWhenInvalid
选项可以实现对不太重要的无效值的优雅处理。如果提供的检查器将结果标记为无效,则新的检查器将返回 undefined。
例如
const Options = object({
// this must be a non-null string,
// or Options is not valid
filename: string(),
// if this field is not a string,
// it will be undefined and Options will pass the checker
description: voidable(string(), {
undefinedWithWarningWhenInvalid: true,
})
})
const result = Options({filename: 'test', description: 1});
assert(result.type === 'success');
assert(result.value.description === undefined);
// there will be a warning
assert(result.warnings.length === 1);