首页 > 解决方案 > 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.

  1. @Enum(Status) status: Status[] | Status: This only accept accepts a single Status but rejects the array of Status
  2. @Enum(Status) status: Status: This also only accept accepts a single Status but rejects the array of Status
  3. @Enum(Status) status: Status[]: This only accept accepts list of Status but rejects the array of Status
  4. @Any(Enum(Status), CollectionOf(Enum(Status))) status: Status[] | Status: This gives AJV_VALIDATION_ERROR on runtime with message FilterParams.status.0 should be object.

What to achieve this validation in TSeD?

标签: typescriptvalidationenums

解决方案


您不能使用装饰器来做到这一点(并且无法像示例中显示的那样混合装饰器)。

解决方案是使用函数 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[];
}

见罗曼


推荐阅读