Skip to content

Thoughts on the CSV ParseOptions type #6739

Open
@eikooc

Description

@eikooc

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 }' ...

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions