typescript - TSeD Mixed type Enum and Collection
问题描述
I am using TSeD version 6.38.1
I have the following model.
import {Any, CollectionOf, Enum, Property} from "@tsed/schema";
export enum Status {
status1,
status2,
...
}
export class FilterParams {
... Some other fields
@Any(Enum(Status), CollectionOf(Enum(Status)))
status: Status[] | Status
}
I struggling to annotate status
field of FilterParams
. I want it to be a Status
or an array of Status
I have tried the following annotations but none of them worked.
@Enum(Status) status: Status[] | Status
: This only accept accepts a singleStatus
but rejects the array ofStatus
@Enum(Status) status: Status
: This also only accept accepts a singleStatus
but rejects the array ofStatus
@Enum(Status) status: Status[]
: This only accept accepts list ofStatus
but rejects the array ofStatus
@Any(Enum(Status), CollectionOf(Enum(Status))) status: Status[] | Status
: This givesAJV_VALIDATION_ERROR
on runtime with messageFilterParams.status.0 should be object.
What to achieve this validation in TSeD?
解决方案
您不能使用装饰器来做到这一点(并且无法像示例中显示的那样混合装饰器)。
解决方案是使用函数 API 来正确描述模式并使用 OnDeserialize 装饰器来确保您始终拥有一个状态数组。
import {Any, CollectionOf, Enum, Property, string, array} from "@tsed/schema";
import {OnDeseriliaze} from "json-mapper";
export enum Status {
status1,
status2,
...
}
const StatusSchema = string().enum(Status)
export class FilterParams {
... Some other fields
@AnyOf(StatusSchema, array().items(StatusSchema))
@OnDeseriliaze(o => [].concat(o))
status: Status[];
}
见罗曼
推荐阅读
- ruby-on-rails - 在 ruby >= 2.5.1 / >= rails 5 中生成随机令牌
- logging - 如何将 .log 文件从一个 Debian 发送到另一个 Linux 操作系统?
- c++ - Visual Studio Windows 控制台应用程序在 main() 的“return 0”上抛出异常
- webdeploy - 迁移到 VS 2019 后无法发布
- php - 如何在 Laravel 测试中发布 Faker 收藏?
- java - 为什么我从正在阅读的文件中将更多行添加到我的数组列表中?
- jquery - 使用刀片和 Jquery 从动态列表中删除 li
- r - 如何在 R 中为小型数据集创建函数?
- java - 如何在 Netbeans 中创建 Java 项目,而不使用 Maven 作为默认值?
- python - 我想在 Python 中为自定义 Alexa 技能、问答项目随机化响应