story
type Verb = 'GET' | 'POST' | 'PUT' | 'DELETE';
export type TerminusType = 'ICAO' | 'IATA' | 'LOCODE' | 'ADDRESS' | 'LATLNG';
It's much better than just assuming it's a string and hoping you don't make a typo.
If the value is supplied from user input then it ensures that you write checks or switch cases.
> type Verb = 'GET' | 'POST' | 'PUT' | 'DELETE';
> export type TerminusType = 'ICAO' | 'IATA' | 'LOCODE' | 'ADDRESS' | 'LATLNG';
> It's much better than just assuming it's a string and hoping you don't make a typo.
> If the value is supplied from user input then it ensures that you write checks or switch cases.
Conceptually, how is this different to an enum?
It also plays nicely with union types, so that you can very quickly define as hoc enums directly in your function declarations, which might be useful if there's only one or two usages of a particular enum, or a section of code where the allowable values very quickly changes.
You basically get a lot of expressiveness without boilerplate, which can be pretty convenient.
There's a hack, it looks like:
export const VERBS = ['GET', 'POST', 'PUT', 'DELETE'] as const;
type VerbTuple = typeof VERBS;
export type Verb = VerbTuple[number];
A real enum would be better, but would violate the "typescript is just javascript" rule.So to use the value you have to import the Enum and use that.
const handlers = { '/': { Verbs.GET: () => .... Verbs.POST: () => ...
Whereas:
const handlers = { '/': { GET: () => .... PAWST: //nope! must be one of GET | POST | PUT | DELETE
Basically it's a lot less work and you don't need to import the enum and maintain it.
Something that people used through ugly hacks becoming part of the language natively in a easy to use and understand (and faster to compile) way sounds very much like pragmatism to me.
Here is the source code to Witness (and other singleton stuff in shapeless) https://github.com/milessabin/shapeless/blob/main/core/src/m...
Just as an example; the `document.getContext` [0] api takes a string argument to select the context canvas.
Without literal types, you cannot enforce this to a set of valid values. Literal types gives you the power to tell the compiler, which values are valid.
Since there are other programming languages that support literal types, it's not just Scala sophistry. :-P
[0] https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasE...