is_a_ts
v1.0.1
Published
Typescript implementation of is_a/2 dynamic typeguard by Krumpet, productionalized by StoneCypher
Downloads
9
Maintainers
Readme
is_a_ts
Typescript implementation of generic type guard, by Ran Lottem
What is this?
The mechanism that most Typescript developers use to distinguish types,
instanceof
, doesn't work at runtime - only compiletime. Making a runtime
version is a complicated affair.
This library exists to centralize and test an function called is_a
(aka
typeGuard
) to solve this problem.
... What is this?
Consider implementing .from
on a custom container. Don't worry about the long
signature; it's just an example.
To implement .from
, your container has an internal typed Array
, and so in
implementing .from
, you'd want to iterate over the input, to make sure all of
the contents fit storage. Initially you might think "well, source
is typed,
should be fine."
class SomeContainer<T> {
_storage: T[];
static from<T>(source: Iterable<T> | ArrayLike<T>): T[] {
const inst = new SomeContainer<T>
source.forEach(item => {
if (item instanceof T) { // HA!
_storage.push(T);
}
});
}
}
See the place where The Joker is laughing at you? That's because instanceof is a compile time thing, and what you're doing requires runtime type inference.
Turns out there isn't a particularly good way to do this in TS. But I found one on some developer's blog, so here, we've productionalized it, and automated the test set.
It's now relatively simple.
import { is_a } from 'is_a_ts';
class SomeContainer<T> {
_storage: T[];
static from<T>(source: Iterable<T> | ArrayLike<T>): T[] {
const inst = new SomeContainer<T>
source.forEach(item => {
if (is_a(item, T)) { // Okay then
_storage.push(T);
}
});
}
}
Nice and simple, the way code ought to be.