API documentation is available at jan-molak.github.io/tiny-types/.
To install the module from npm:
npm install --save tiny-types
Defining Tiny Types
An int on its own is just a scalar with no meaning. With an object, even a small one, you are giving both the compiler and the programmer additional information about what the value is and why it is being used.
To define a single-value
TinyType - extend from
Every tiny type defined this way has
a readonly property
value of type
T, which you can use to access the wrapped primitive value. For example:
;firstName.value === 'Jan';
Each tiny type object has an
equals method, which you can use to compare it by value:
name1 = new FirstName'Jan',name2 = new FirstName'Jan';name1.equalsname2 === true;
An additional feature of tiny types is a built-in
;name.toString === 'FirstName(value=Jan)';
Which you can override if you want to:
;timestampt.toString === 'Timestamp(value=2018-03-12T00:30:00.000Z))'
Multi-value and complex types
If the tiny type you want to model has more than one value,
or you want to perform additional operations in the constructor,
You can also mix and match both of the above definition styles:
Even such complex types still have both the
now = new Date2018, 2, 12, 0, 30,event1 = new AccountCreatednew UserName'jan-molak', new Timestampnow,event2 = new AccountCreatednew UserName'jan-molak', new Timestampnow;event1.equalsevent2 === true;event1.toString === 'AccountCreated(username=UserName(value=jan-molak), value=Timestamp(value=2018-03-12T00:30:00.000Z))'
Serialisation to JSON
Single-value TinyTypes are serialised to the value itself:
;;firstName.toJSON === 'Jan'
Complex TinyTypes are serialised recursively:
De-serialisation from JSON
Although you could define standalone de-serialisers, I like to define them as static factory methods on the TinyTypes themselves:
;FirstName.fromJSONfirstName.toJSON.equalsfirstName === true
When working with complex TinyTypes, you can use the (experimental)
to reduce the likelihood of your custom
fromJSON method being incompatible with
This way de-serialising a complex type becomes trivial:
;;allocation.equalsdeserialised === true
Serialised is by no means 100% foolproof as it's only limited to checking whether your input JSON has the same fields
as the object you're trying to de-serialise, it can at least help you to avoid errors caused by typos.
Your feedback matters!
Do you find TinyTypes useful? Give it a star! ★
Found a bug? Need a feature? Raise an issue or submit a pull request.
Have feedback? Let me know on twitter: @JanMolak
TinyTypes library is licensed under the Apache-2.0 license.
- Copyright © 2018- Jan Molak