Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Pull Request
Use TypeScript's new template literal types to improve the command option types. This allows the option flags to be parsed at the type level, giving accurate types to the resulting program object instead of falling back on
{ [key: string]: any }
.--no-
prefixed optionsProblem
Currently there is no real type checking for options, so I might access an option that doesn't exist.
Solution
TypeScript recently added template literal types, allowing types to match patterns in strings. This allows us to parse the option name, and whether it has a required/optional value. Note that this feature is not released yet, but could be released with TypeScript 4.1.0.
See a working example on the typescript playground. Scroll to the bottom and hover the
program
variable.TypeScript will fail to compile if the option flags are not in the right format.
To get the right behavior, the result of chaining off of
commander
needs to be assigned to a new variable, since the type is built up as a result of the chaining.ChangeLog