Type Your HashMaps with TypeScript
It’s my HashMap, I’ll do what I want to
First off, I know what you’re going to say. Why use your own HashMap if you can make a Map
or WeakMap
? Sometimes, you just want to use a Plain Old JavaScript Object (POJO). There could be a variety of reasons for this, maybe you just need to keep track of data when iterating or maybe you’re working on some arguments for a function.
function doCoolStuff(params: Params, options: OptionsMap) {
// cool stuff
}
In the case above, I might have a strictly typed Params
, but the options could vary, so I want to keep them pretty flexible. I use any
a lot as a placeholder and try to get away from it when I can. A cool option for this is to type a hashMap.
// simple HashMap, assume it can take all string or boolean values
interface OptionsMap { [key: string]: string | boolean }
const options: OptionsMap = {
cacheId: 'u21987',
useDefaultValues: true,
responseAs: 'json'
};
Looking at this code, we can type out the options so the values can be either a string
or a boolean
. This allows users to enter any extra options they want that are supported by this function. This is definitely useful if you work with a development server for your back-end and want to pass special dev options for testing.
Type Happy
You can even be more explicit and type the values to something more concrete.
interface User {
name: string;
level: number;
status: string;
}
interface HashMap<T> {
[key: string]: T
}
// init the map
const userMap: HashMap<User> = {};
userMap['bob'] = {
name: 'bob',
level: 12,
status: 'afk'
}
Here, we’ve typed our HashMap
to only accept values of T
. This is pretty useful when working with response data or possibly some cache implementation you might build.
You can do more
This typed HashMap is a great way to start a building block of types in your application. You might even move on to incorporatinbg Utility Types. You can mix and match these to do some amazing things with TypeScript. I just wanted to cover a really simple way you can get started to move beyond typing your still-in-progress types as any
.