<p>나를 따라오세요. 약간 혼란스러울 수 있습니다.</p><p><ul><li>저는 NestJ와 클래스 유효성 검사기/변환기를 사용하고 있습니다.
두 가지 유형을 포함할 수 있는 배열이 있습니다. 나는 @Type을 사용하여 판별자를 통해 항목을 정의합니다. </li><li>직렬화에 필요하기 때문에 Transform을 사용합니다. 그렇지 않으면 빈 개체가 생성됩니다. </li></ul></p><p>이제 문제는 내 판별자가 7개의 값을 가진 열거형이라는 것입니다. 그 중 6개는 한 클래스를 가리키고 마지막 하나는 다른 종류를 가리킵니다. 문제는 열거형 유형이 무엇이든 직렬화할 때 항상 첫 번째 하위 유형으로 변경된다는 것입니다.
<pre class="brush:js;toolbar:false;">enum DiscrType = {A: "a", B: "b", C: "c"}
클래스 판별자 {
@IsEnum(디스크 유형)
유형: 디스크 유형
}
클래스 ClassONE은 판별자 {...}를 확장합니다.
클래스 ClassTWO는 판별자 {...}를 확장합니다.
클래스 물건 {
@Type(() => 판별자, {
판별자: {
속성: '유형',
하위 유형: [
{ 값: ClassTWO, 이름: DiscrType.C},
{ value: ClassONE, name: DiscrType.A}, // B이더라도 항상 이 값으로 바뀐다.
{ 값: ClassONE, 이름: DiscrType.B},
],
},
keepDiscriminatorProperty: true,
})
@변환(
({ 값 }) =>
value?.map((객체: ClassONE | ClassTWO ) =>
object.type === DiscrType.C
? plainToClass(classTWO, 객체)
: plainToClass(ClassONE, 객체),
),
)
@ValidateNested({각각: true})
속성: (ClassONE | ClassTWO)[]
}
</pre>
<p>행동:</p>
<pre class="brush:js;toolbar:false;">new Stuff({type: DiscrType.B,...}) // 클래스 직렬 변환기를 사용한 직렬화
// 예상되는:
x = {유형: "b",...}
// 실제:
x = {유형: "a",...}<span style="font-family:'sans serif, tahoma, verdana, helvetica';"><span style="white-space:nowrap;" ></span></span></pre>
<p><br /></p>
지금으로서는 이것이 완벽한 솔루션인지 확신할 수 없지만 제 프로젝트에서는 @Type을 이것으로 바꾼 후에도 모든 테스트가 계속 실행됩니다.
으아악이 방법이 효과가 있으므로 솔루션으로 남겨 두겠습니다. 그런데 이 솔루션 대신 판별자를 사용해야 하는 이유를 알고 계시다면 어떤 이점이 있는지 언급해 주세요.