函数参数验证

116 阅读2分钟

强调

  • 富有表现力的可链接 API
  • 大量内置验证
  • 支持自定义验证
  • Node.js 中的自动标签推断
  • 用 TypeScript 编写

安装

npm install ow

用法

import ow from 'ow';

const unicorn = input => {
    ow(input, ow.string.minLength(5));

    // …
};

unicorn(3);
//=> ArgumentError: Expected `input` to be of type `string` but received type `number`

unicorn('yo');
//=> ArgumentError: Expected string `input` to have a minimum length of `5`, got `yo`

我们还可以匹配对象的形状。

import ow from 'ow';

const unicorn = {
    rainbow: '🌈',
    stars: {
        value: '🌟'
    }
};

ow(unicorn, ow.object.exactShape({
    rainbow: ow.string,
    stars: {
        value: ow.number
    }
}));
//=> ArgumentError: Expected property `stars.value` to be of type `number` but received type `string` in object `unicorn`

*注意: *如果您打算ow仅用于开发目的,请使用import ow from 'ow/dev-only'而不是通常的设置为(例如import ow from 'ow'运行捆绑。这将在生产中运行时自动导出 shim,这将显着降低包大小。NODE_ENV``production``$ NODE_ENV="production" parcel build index.js``ow

API

完整的 API 文档

Ow 包含 TypeScript 类型保护,因此使用它将缩小以前未知值的类型。

function (input: unknown) {
    input.slice(0, 3) // Error, Property 'slice' does not exist on type 'unknown'

    ow(input, ow.string)

    input.slice(0, 3) // OK
}

ow(值,谓词)

测试是否value与提供的predicateArgumentError如果测试失败,则抛出一个。

ow(值,标签,谓词)

测试是否value与提供的predicate. 如果测试失败,则抛出ArgumentError指定的。label

是在 Node.js 中自动推断出来的label,但您可以通过传入 的值来覆盖它label。自动标签推断在浏览器中不起作用。

ow.isValid(值,谓词)

如果值与谓词匹配则返回true,否则返回false

ow.create(谓词)

创建一个可重用的验证器。

const checkPassword = ow.create(ow.string.minLength(6));

const password = 'foo';

checkPassword(password);
//=> ArgumentError: Expected string `password` to have a minimum length of `6`, got `foo`

ow.create(标签,谓词)

创建一个具有特定label.

const checkPassword = ow.create('password', ow.string.minLength(6));

checkPassword('foo');
//=> ArgumentError: Expected string `password` to have a minimum length of `6`, got `foo`

ow.any(...谓词[])

返回一个谓词,该谓词验证该值是否与给定谓词中的至少一个匹配。

ow('foo', ow.any(ow.string.maxLength(3), ow.number));

ow.optional.{type}

使谓词可选。可选谓词意味着如果值为 ,它不会失败undefined

ow(1, ow.optional.number);

ow(undefined, ow.optional.number);

哇。{类型}

以下所有类型都返回一个谓词。每个谓词都有一些额外的运算符,您可以使用它们来更细粒度地测试值。

原语

内置类型

类型化数组

结构化数据

各种各样的

谓词

以下谓词可用于每种类型。

不是

反转以下谓词。

ow(1, ow.number.not.infinite);

ow('', ow.string.not.empty);
//=> ArgumentError: Expected string to not be empty, got ``

是(fn)

使用自定义验证功能。true如果值匹配验证则返回,如果false不匹配则返回。

ow(1, ow.number.is(x => x < 10));

ow(1, ow.number.is(x => x > 10));
//=> ArgumentError: Expected `1` to pass custom validation function

除了返回false,您还可以返回导致失败的自定义错误消息。

const greaterThan = (max: number, x: number) => {
    return x > max || `Expected `${x}` to be greater than `${max}``;
};

ow(5, ow.number.is(x => greaterThan(10, x)));
//=> ArgumentError: Expected `5` to be greater than `10`

验证(fn)

使用自定义验证对象。不同之is处在于该函数应该返回一个验证对象,这允许更大的灵活性。

ow(1, ow.number.validate(value => ({
    validator: value > 10,
    message: `Expected value to be greater than 10, got ${value}`
})));
//=> ArgumentError: (number) Expected value to be greater than 10, got 1

您还可以传入一个函数作为message接受标签作为参数的值。

ow(1, 'input', ow.number.validate(value => ({
    validator: value > 10,
    message: label => `Expected ${label} to be greater than 10, got ${value}`
})));
//=> ArgumentError: Expected number `input` to be greater than 10, got 1

消息(字符串 | fn)

提供自定义消息:

ow('🌈', 'unicorn', ow.string.equals('🦄').message('Expected unicorn, got rainbow'));
//=> ArgumentError: Expected unicorn, got rainbow

您还可以传入一个函数,该函数将值作为第一个参数,将标签作为第二个参数,并期望返回消息。

ow('🌈', ow.string.minLength(5).message((value, label) => `Expected ${label}, to have a minimum length of 5, got `${value}``));
//=> ArgumentError: Expected string, to be have a minimum length of 5, got `🌈`

也可以为每个验证添加单独的消息:

ow(
    '1234',
    ow.string
        .minLength(5).message((value, label) => `Expected ${label}, to be have a minimum length of 5, got `${value}``)
        .url.message('This is no url')
);
//=> ArgumentError: Expected string, to be have a minimum length of 5, got `1234`

ow(
    '12345',
    ow.string
        .minLength(5).message((value, label) => `Expected ${label}, to be have a minimum length of 5, got `${value}``)
        .url.message('This is no url')
);
//=> ArgumentError: This is no url

这对于创建自己的可重用验证器很有用,这些验证器可以提取到单独的 npm 包中。

打字稿

需要 TypeScript 4.7 或更高版本。

Ow 包含一个类型实用程序,可让您从给定谓词中提取 TypeScript 类型。

import ow, {Infer} from 'ow';

const userPredicate = ow.object.exactShape({
    name: ow.string
});

type User = Infer<typeof userPredicate>;