In the following TypeScript function declaration, the alignment parameter type is a set of unioned literals.
function printText(s: string, alignment: "left" | "right" | "center") {
// ...
}
According to the docs on literals, a variable of type string is not assignable to alignment because strictly speaking it’s not of type "left" | "right" | "center".
The documentation says to use a type assertion like so:
printText("Test", printerConfig.textAlignment as "left");
And this would also work:
const printerConfig = { textAlignment: "left" } as const;
printText("Test", printerConfig.textAlignment);
Now imagine:
- The
printTextfunction was in a library and I could not change it. - My code had been passed a
printerConfigobject or it’d read it from a JSON config file. - That its
textAlignmentproperty was of typestring.
How can I call the printText function?
>Solution :
I’d think you would not want to call printText if the alignment was not a sensible value – what if the caller of your code passed a bad config object, or the JSON was badly formatted? You’d probably want to throw an error before calling printText.
Narrow the type of the textAlignment before passing it. If it’s not the right type, throw an error.
// have checks of textAlignment narrow this new variable
const { textAlignment } = printerConfig;
if (textAlignment !== 'left' && textAlignment !== 'right' && textAlignment !== 'center') {
throw new Error(`Invalid textAlignment: ${textAlignment}`);
}
printText("Test", textAlignment);