1 min read

Typescript and hapi payloads

Using hapi's request.payload from Typescript without compiler errors.

I’ve spent a bit of time on this over the last couple of days - it’s probably really obvious to people more familiar with Typescript, but I’m getting there. :-)

The problem

Typescript kept complaining when I used fields from the payload object:

src/code.ts:65:37 - error TS2339: Property 'previousUrl' does not exist on type 'string | object | Buffer | Readable'.

And it’s not wrong - that property doesn’t exist there.

Since the type of payload is already declared, I couldn’t just declare a new interface with a different value.

A solution

I’m not claiming this is the best solution necessarily, but it does work, and it seems in keeping with the whole Typescript approach of “don’t make things an any object”.

What I did was define a new interface:

interface myInterface {
	previousUrl: string
};

And then use payload as that:

h.redirect((request.payload as myInterface).previousUrl);

A note on hapi

I thought I’d try hapi after using Express for a while. I’m still learning the patterns, but so far it seems nice, actually. It follows the “batteries included” approach from Python, but the batteries are plugins, so you only import the ones you want.