class-transformer icon indicating copy to clipboard operation
class-transformer copied to clipboard

fix: exposeDefaultValues does not work

Open js-d-coder opened this issue 2 years ago • 6 comments

Description

Please consider this code:

import "reflect-metadata";
import { Expose, plainToInstance } from "class-transformer";
import { IsNumber } from "class-validator";

class IMDB {
    @IsNumber()
    @Expose()
    rating: number = 0;

    @IsNumber()
    @Expose()
    votes: number;

    @IsNumber()
    @Expose()
    id: number;
}

const plainObj = {
    votes: 1000,
    id: 1
};

const movie1 = plainToInstance(IMDB, plainObj, {
    excludeExtraneousValues: true,
    enableImplicitConversion: true,
    exposeUnsetFields: false,
    exposeDefaultValues: false,
});

console.log(movie1); // IMDB { rating: 0, votes: 1000, id: 1 }

As you can notice IMDB class has a property rating with default value. Sometimes I want the instance object to not have default value if the property is missing and sometimes I do.
To achieve this using exposeDefaultValues: false option if I don't want default value for the missing property.
exposeDefaultValues: false seems to not be working in above code snippet.

Expected behavior

Default value should not be set to rating property i.e. rating property should not have value of 0 and should not be present in movie1 object.

Actual behavior

'ratingproperty has default value set inmovie1` object.

js-d-coder avatar Aug 31 '23 07:08 js-d-coder

Hey @js-d-coder , I faced with similar issue during upgrading to Node 18 and using "target": "es2022" instead of es2021 in tsconfig. Switching back to es2021 helped me 🤷‍♂️

pahuta avatar Oct 02 '23 16:10 pahuta

I'm seeing the same issue where exposeDefaultValues is being ignored for plainToClass.

clapacik-circle avatar Feb 07 '24 22:02 clapacik-circle

It seems that, when used together with exposeUnsetFields:false, exposeDefaultValues:false does not work as expected. I think this should be checked.

diffy0712 avatar May 09 '24 20:05 diffy0712