细化
细化 是一个针对 Flow 或 TypeScript 中混合 / 未知值的类型细化和验证器组合库。
入门
细化发布为 @recoiljs/refine 在 NPM 上。
要开始了解细化,请查看有关 实用程序 和 检查器 的核心概念的文档。
为什么我想要使用细化?
- 当您的代码遇到
unknown
TypeScript 类型或mixed
Flow 类型值时,细化很有用,并且您需要 断言这些值具有特定的静态类型。 - 细化提供了一个 API 用于构建类型细化辅助函数,这些函数可以验证未知值是否符合预期类型。
- 细化可以验证输入值并 从先前版本升级。
类型细化示例
将未知类型强制转换为强类型变量。 assertion()
如果输入与预期类型不匹配,将抛出异常,而 coercion()
将返回 null
。
const myObjectChecker = object({
numberProperty: number(),
stringProperty: optional(string()),
arrayProperty: array(number()),
});
const myObjectAssertion = assertion(myObjectChecker);
const myObject: CheckerReturnType<myObjectChecker> = myObjectAssertion({
numberProperty: 123,
stringProperty: 'hello',
arrayProperty: [1, 2, 3],
});
向后兼容示例
使用 match()
和 asType()
,您可以从先前类型升级到最新版本。
const myChecker: Checker<{str: string}> = match(
object({str: string()}),
asType(string(), str => ({str: str})),
asType(number(), num => ({str: String(num)})),
);
const obj1: {str: string} = coercion(myChecker({str: 'hello'}));
const obj2: {str: string} = coercion(myChecker('hello'));
const obj3: {str: string} = coercion(myChecker(123));
JSON 解析器示例
细化包装 JSON
以提供内置的强类型解析器。
const myParser = jsonParser(
array(object({num: number()}))
);
const result = myParser('[{"num": 1}, {"num": 2}]');
if (result != null) {
// we can now access values in num typesafe way
assert(result[0].num === 1);
} else {
// value failed to match parser spec
}
在 Recoil 同步中使用
Recoil 同步 库利用 细化 进行类型细化、输入验证和类型升级以实现向后兼容性。有关更多详细信息,请参阅 recoil-sync
文档。