A utility library for creating mapped types in TypeScript with support for class-validator and class-transformer metadata inheritance




A utility library for creating mapped types in TypeScript with support for
class-validator and class-transformer metadata inheritance.
``bash`
npm install @vivtel/mapped-types
For validation and transformation features, install the optional peer
dependencies:
`bash`
npm install class-validator class-transformer reflect-metadata
- Create new types by picking, omitting, or making properties optional
- Create intersection types from multiple classes
- Inherit validation metadata from class-validator
- Inherit transformation metadata from class-transformer
- Inherit property initializers from source classes
- Zero dependencies (class-validator and class-transformer are optional)
Creates a new type by picking a set of properties from an existing class.
`typescript
import { PickType } from '@vivtel/mapped-types';
import { IsString, IsEmail } from 'class-validator';
class UserDto {
@IsString()
name: string;
@IsEmail()
email: string;
@IsString()
password: string;
}
// CreateUserDto will have name, email, and password properties
// with the same validation rules as UserDto
class CreateUserDto extends PickType(UserDto, ['name', 'email', 'password']) {}
`
Creates a new type by omitting a set of properties from an existing class.
`typescript
import { OmitType } from '@vivtel/mapped-types';
import { IsString, IsEmail } from 'class-validator';
class UserDto {
@IsString()
name: string;
@IsEmail()
email: string;
@IsString()
password: string;
}
// UserResponseDto will have name and email properties, but not password
// with the same validation rules as UserDto
class UserResponseDto extends OmitType(UserDto, ['password']) {}
`
Creates a new type by making all properties of an existing class optional.
`typescript
import { PartialType } from '@vivtel/mapped-types';
import { IsString, IsEmail } from 'class-validator';
class UserDto {
@IsString()
name: string;
@IsEmail()
email: string;
}
// UpdateUserDto will have optional name and email properties
// with the same validation rules as UserDto, but they'll only be
// applied if the properties are defined
class UpdateUserDto extends PartialType(UserDto) {}
`
Creates a new type by intersecting multiple existing classes.
`typescript
import { IntersectionType } from '@vivtel/mapped-types';
import { IsString } from 'class-validator';
class UserDto {
@IsString()
name: string;
}
class AddressDto {
@IsString()
street: string;
}
// UserWithAddressDto will have both name and street properties
// with the same validation rules as the original classes
class UserWithAddressDto extends IntersectionType(UserDto, AddressDto) {}
`
For detailed API documentation, please visit our
API Reference.
`typescript`
function PickType
classRef: Type
keys: readonly K[]
): MappedType
`typescript`
function OmitType
classRef: Type
keys: readonly K[]
): MappedType
`typescript`
function PartialType
classRef: Type
options: {
skipNullProperties?: boolean;
} = {}
): MappedType
`typescript``
function IntersectionType
...classRefs: T
): MappedType<
RemoveFieldsWithType<
UnionToIntersection
Function
>
>;
Please read our Contributing Guide for details on our code
of conduct and the process for submitting pull requests.
We use SemVer for versioning and
Changesets to manage releases. For
the versions available, see the
tags on this repository.
This project is licensed under the MIT License - see the LICENSE file
for details.