An invariant function takes a value, and if the value is falsy then the invariant function will throw. If the value is truthy, then the function will not throw.
importinvariantfrom'tiny-invariant';invariant(truthyValue,'This should not throw!');invariant(falsyValue,'This will throw!');// Error('Invariant violation: This will throw!');
Why tiny-invariant?
The library: invariant supports passing in arguments to the invariant function in a sprintf style (condition, format, a, b, c, d, e, f). It has internal logic to execute the sprintf substitutions. The sprintf logic is not removed in production builds. tiny-invariant has dropped all of the sprintf logic. tiny-invariant allows you to pass a single string message. With template literals there is really no need for a custom message formatter to be built into the library. If you need a multi part message you can just do this: invariant(condition, 'Hello, ${name} - how are you today?')
Type narrowing
tiny-invariant is useful for correctly narrowing types for flow and typescript
constvalue:Person|null={name:'Alex'};// type of value == 'Person | null'invariant(value,'Expected value to be a person');// type of value has been narrowed to 'Person'
API: (condition: any, message?: string) => void
condition is required and can be anything
message is an optional string
Installation
Dropping your message for kb savings!
Big idea: you will want your compiler to convert this code:
invariant(condition, 'My cool message that takes up a lot of kbs');
if (!condition) {
if ('production' !== process.env.NODE_ENV) {
invariant(false, 'My cool message that takes up a lot of kbs');
} else {
invariant(false);
}
}