跳至主要内容

Refine 0.1

·阅读时长 2 分钟

针对 Flow 和 TypeScript 的类型细化和输入验证库 @recoiljs/refine 的首个开源版本!要开始学习 Refine,请查看关于核心概念的文档,包括 实用程序检查器.

Recoil Sync 库利用 Refine 进行类型细化、输入验证和升级类型以实现向后兼容。有关更多详细信息,请参阅 recoil-sync 文档.

为什么要使用 Refine?

  • 当你的代码遇到 unknown TypeScript 类型或 mixed Flow 类型值,并且你需要 断言这些值具有特定的静态类型 时,Refine 会很有用。
  • Refine 提供了一个 API 用于构建类型细化辅助函数,这些函数可以验证未知值是否符合预期类型。
  • Refine 可以验证输入值并 从先前版本升级.

类型细化示例

将未知类型强制转换为强类型变量。 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 解析器示例

Refine 包装了 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
}