Class Fillable DTO with validation functionality. ๐ฉ NodeJS only.
class MyCoolDto extends FillableDto {
public shouldDisplayMessage: boolean;
}
const INCLUDE_KEYS: ReadonlyArray<keyof IMyCoolDto> = [
'shouldDisplayMessage',
] as const;
class MyCoolDto extends FillableDto implements IMyCoolDto {
public readonly shouldDisplayMessage: boolean;
public constructor(attributes: Partial<IMyCoolDto>) {
super(attributes, INCLUDE_KEYS);
}
}
const myCoolDto = new MyCoolDto({
shouldDisplayMessage: false,
thisPropertyWillBeStripped: true,
});
const DEFAULT_VALUES: Readonly<IMyCoolDto> = {
shouldDisplayMessage: false,
} as const;
class MyCoolDto extends FillableDto implements IMyCoolDto {
public readonly shouldDisplayMessage: boolean;
public constructor(attributes: Partial<IMyCoolDto>) {
super(attributes, undefined, DEFAULT_VALUES);
}
}
DO NOT SET DEFAULT VALUES IN CLASS PROPERTIES!!!
Attributes argument passed to the constructor will be overwritten with a class property default value.
const DEFAULT_VALUES: Readonly<IMyCoolDto> = {
shouldDisplayMessage: false,
} as const;
class MyCoolDto extends FillableDto implements IMyCoolDto {
public readonly isActive: boolean = false; // ๐โโ ๏ธ No!!!
public readonly shouldDisplayMessage: boolean;
public constructor(attributes: Partial<IMyCoolDto>) {
super(attributes, undefined, DEFAULT_VALUES);
}
}
const myCoolDto = new MyCoolDto({
isActive: true,
shouldDisplayMessage: false,
});
// `false` as in class property default declaration
console.log(myCoolDto.isActive); // false
interface IMyCoolDto {
shouldDisplayMessage: boolean;
}
const INCLUDE_KEYS: ReadonlyArray<keyof IMyCoolDto> = [
'shouldDisplayMessage',
] as const;
const DEFAULT_VALUES: Readonly<IMyCoolDto> = {
shouldDisplayMessage: false,
} as const;
class MyCoolDto extends FillableDto implements IMyCoolDto {
public readonly shouldDisplayMessage: boolean;
public constructor(attributes: Partial<IMyCoolDto>) {
super(attributes, INCLUDE_KEYS, DEFAULT_VALUES);
}
}
import { IsBoolean } from 'class-validator';
class MyCoolDto extends FillableDto implements IMyCoolDto {
@IsBoolean()
public readonly shouldDisplayMessage: boolean;
public constructor(attributes: Partial<IMyCoolDto>) {
super(attributes, INCLUDE_KEYS, DEFAULT_VALUES);
}
}
const attributes = { shouldDisplayMessage: true };
const includeKeys = ["isActive", "shouldDisplayMessage"];
const defaults = { isActive: true };
const myCoolDto = new MyCoolDto(attributes, includeKeys, defaults);
// re-assing everithing
myCoolDto.assign(attributes, includeKeys, defaults);
const myCoolDtoFromJSON = MyCoolDto
.fromJSON(`{"shouldDisplayMessage":true}`);
const myCoolDtoFromObject = MyCoolDto
.fromPlain({ shouldDisplayMessage: true });
const isValid = myCoolDto.isValid(true); // silent
myCoolDto.isValid(false); // throws error
const error: null | string = myCoolDto.getError();
const errors: string[] = myCoolDto.getErrors();
myCoolDto.toJSON(); // creates plain object clone
myCoolDto.toObject(); // creates plain object clone
myCoolDto.toString(); // object packed in JSON string
myCoolDto.lock(); // prevents further modifications
import { validateInstance } from '@corefunc/class-fillable-dto';
// Empty array if there is no errors.
validateInstance(new ClassName());
// ['Provided value is not an object. Value is [null].']
validateInstance(null);