gpt4 book ai didi

javascript - 如何使用 io-ts 验证数组长度?

转载 作者:行者123 更新时间:2023-11-30 13:55:13 25 4
gpt4 key购买 nike

我正在研究 io-ts验证我想验证列表长度的地方(它必须在最小值和最大值之间)。我想知道是否有一种方法可以实现这种行为,因为它可以在运行时非常方便地进行 API 端点验证。

我目前的情况是

interface IMinMaxArray {
readonly minMaxArray: unique symbol // use `unique symbol` here to ensure uniqueness across modules / packages
}

const minMaxArray = (min: number, max: number) => t.brand(
t.array,
(n: Array): n is t.Branded<Array, IMinMaxArray> => min < n.length && n.length < max,
'minMaxArray'
);

上面的代码不起作用,它需要一个参数用于 Array-s 并且 t.array 也不被接受。我怎样才能使这项工作以通用方式进行?

最佳答案

您的定义缺少数组的类型和编解码器。您可以通过对接口(interface)定义进行一些修改并使用编解码器扩展品牌类型来完成这项工作:

interface IMinMaxArray<T> extends Array<T> {
readonly minMaxArray: unique symbol
}

const minMaxArray = <C extends t.Mixed>(min: number, max: number, a: C) => t.brand(
t.array(a),
(n: Array<C>): n is t.Branded<Array<C>, IMinMaxArray<C>> => min < n.length && n.length < max,
'minMaxArray'
);

现在您可以创建如下定义

minMaxArray(3,5, t.number)

如果您希望定义更加通用和可组合,您可以编写一个接受谓词的通用品牌类型:

interface RestrictedArray<T> extends Array<T> {
readonly restrictedArray: unique symbol
}

const restrictedArray = <C>(predicate: Refinement<C[], ArrayOfLength<C>>) => <C extends t.Mixed>(a: C) => t.brand(
t.array(a), // a codec representing the type to be refined
(n): n is t.Branded<C[], RestrictedArray<C>> => predicate(n), // a custom type guard using the build-in helper `Branded`
'restrictedArray' // the name must match the readonly field in the brand
)

interface IRestrictedArrayPredicate<C extends t.Mixed> {
(array: C[]): array is ArrayOfLength<C>
}

现在您可以定义您的限制。单独定义 min 和 max 可能是个好主意,因为它们本身也很有用:

const minArray = <C extends t.Mixed>(min: number) 
=> restrictedArray(<IRestrictedArrayPredicate<C>>((array) => array.length >= min));
const maxArray = <C extends t.Mixed>(max: number)
=> restrictedArray(<IRestrictedArrayPredicate<C>>((array) => array.length <= max));

结合这两者你可以定义 minMaxArray:

export const minMaxArray = <C extends t.Mixed>(min: number, max: number, a: C) => t.intersection([minArray(min)(a), maxArray(max)(a)])

希望这对您有所帮助。

关于javascript - 如何使用 io-ts 验证数组长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57429769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com