Description
Hello, I don't know if it is intentional and what the gains are of the CSV module's options that are passed in through the parse
function.
This is the function signature:
export function parse<const T extends ParseOptions>(
input: string,
options: T,
): ParseResult<ParseOptions, T>
I understand the reason for having it extend like above gives the possibility of the parser to extract the columns
attribute and use that to make the resulting array "know" which keys are in object.
But the current implementation allows the options
to be any record that extends the ParseOptions
type, allowing developers to add extra options to the object that are then ignored if just one valid key is given, as in this example:
parse('a;b;c', { skipFirstRow: true, lacyQuotes: true })
This doesn't get caught.
This can become an issue when making typos as the TypeScript compiler doesn't catch any mistakes.
I suggest instead that we make the function signature something like this:
type ExcludeInvalidKeys<T> = Record<
Exclude<keyof T, keyof ParseOptions>,
never
>
export function parse<const T extends ParseOptions>(
input: string,
options: ExcludeInvalidKeys<T>,
): ParseResult<ParseOptions, T>
Which now correctly rejects invalid keys, but the error could be nicer. I just don't have the TypeScript-fu to do it. The error becomes:
type 'false' is not assignable to 'never'
The expected type comes from property 'lacyQuotes' which is declared here on type '{ readonly skipFirstRow: true; readonly lacyQuotes: true }' ...