typestack / class-transformer

Decorator-based transformation, serialization, and deserialization between objects and classes.
MIT License
6.86k stars 503 forks source link

fix: exposeDefaultValues does not work #1609

Open js-d-coder opened 1 year ago

js-d-coder commented 1 year ago

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.

pahuta commented 1 year ago

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 🤷‍♂️

clapacik-circle commented 8 months ago

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

diffy0712 commented 5 months ago

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

diffy0712 commented 5 months ago

The same error is making test cases fail on https://github.com/typestack/class-transformer/issues/1505#issuecomment-2116699303. These should pass with the fix.

cc: @ahochsteger

TonyDo99 commented 2 months ago

Do we have any updates on this issue ?