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
printText
function was in a library and I could not change it. - My code had been passed a
printerConfig
object or it'd read it from a JSON config file. - That its
textAlignment
property was of typestring
.
How can I call the printText
function?
CodePudding user response:
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);