Skip to content

Serializers for typescript based on decorators

License

Notifications You must be signed in to change notification settings

DudaevAR/serialize

This branch is 1 commit ahead of, 42 commits behind AndriiZelenskyi/serialize:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

author
Alexander Dudaev
Dec 24, 2018
92a9272 · Dec 24, 2018

History

41 Commits
Dec 24, 2018
Oct 16, 2018
Jan 18, 2018
Jul 28, 2017
Dec 18, 2018
Aug 1, 2017
Jan 18, 2018
Dec 18, 2018
Dec 18, 2018
Dec 5, 2018
Dec 6, 2018
Dec 6, 2018

Repository files navigation

Serialize TS

Metadata library that created to resolve your pain with all mappers and type-checking of objects after serialization or deserialization.

Don`t use the spread operator for copying of your models because prototypes chain will be lost after it!

Getting started

Instalation

  1. Add a dependency to your package.json file:

npm install serialize-ts --save or yarn add serialize-ts; 2. Change a tsconfig.json:

{
    ...
    compilerOptions: {
        ...
        emitDecoratorMetadata: true,
        ...
    },
    ...
}

Exmaples

Serialization

Simple model:

class TestModel {
  @Field()
  @Name("sever-id")
  id: number;

  @Field()
  fullName: string;

  ignoredField: any;
}

const model = new TestModel();
model.id = 12;
model.fullName = "Default full name";
model.ignoredField = { customName: "test" };

console.log(serialize(model));

/*Output -> {
    server-id: 12,
    fullName: 'Default full name'
}*/

const obj = {
  "server-id": 12,
  fullName: "Default full name",
  "custom-date-name": "2017-08-01T06:09:53.802Z"
};

console.log(deserialize(obj, TestModel));

/*Output -> TestModel {
    id: 12,
    fullName: 'Default full name',
    startDate: new Date('2017-08-01T06:09:53.802Z')
}*/

Nested models:

class OuterModel {
    @Field()
    id: number;

    @Field()
    nestedModel: NestedModel;
}

@Model()
class NestedModel {
    @Field()
    firstField: number;
    @Field()
    secondField: string;
}

const obj = {
    id: 12,
    nestedModel: {
        firstField: 24,
        secondField: 'Some awesome string!'
    }
};

const outerModel = deserialize(obj, TestModel);
console.log(outerModel);

/*
    Output -> OuterModel {
        id: 12,
        nestedModel: NestedModel {
            firstField: 24,
            secondField: "Some awesome string!"
        }
    }
*/

console.log(serialize(outerModel));

/*
    Output -> {
        id: 12,
        nestedModel: {
            firstField: 24,
            secondField: "Some awesome string!"
        }
    }
*/

Arrays:

class Test {
    @Field()
    id: number;

    @Field()
    @Name('numbers')
    @Serializer(new ArraySerializer(new PrimitiveSerializer()))
    arrayOfNumbers: number[];
}

const obj = {
    id: 12,
    numbers: [12, 24, 36, 48]
};

const deserializedModel = deserialize(obj, Test);
console.log(deserializedModel);
/*
    Output -> Test {
        id: 12,
        arrayOfNumber:  [12, 24, 36, 48]
    }
*/

Custom serializers:

class CustomSerializer implements Serializer<Object> {
    serialize(model: Object) {
        // Do some custom logic
    }

    deserialize(json: Object) {
        // Do your custom logic and return deserialized object
    }
}

class Model {
    @Field()
    id: 12;

    @Field()
    @Serializer(new CustomSerializer())
    customField: any;
}

If you have some troubles with serialization without serializer decorator definition, you are able to define it with @Serializer(YourCustomModel) or with some default type like Date or String. I am waiting for the issues of course!

About

Serializers for typescript based on decorators

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 98.5%
  • JavaScript 1.5%