Skip to content

Improve Typescript oneof generated types #947

Open
@HenriBeck

Description

@HenriBeck

When started using grpcweb, we found the typings of a oneof statement rather outdated and not type-safe.

Problems

With the current typings being an object with just optional keys, we found it to be not very developer-friendly.

type Type = {
  email?: string,
  password?: string,
};

The above type doesn't make it clear that the email or password can be set, and also doesn't prevent any misuse of the data.

Solution

The best typing that we could come up with was the following:

enum OneOfCase {
  NOT_SET = 0,
  EMAIL = 1,
  PASSWORD = 2
}

type Type =
  | {
      case: OneOfCase.NOT_SET;
    }
  | {
      case: OneOfCase.EMAIL;
      email: string;
    }
  | {
      case: OneOfCase.PASSWORD;
      password: string;
    };

These typings improve a few things:

  • Improves the switch/case handling as it only allows to access the correct fields
  • Makes the oneof intent clearer as only one field could ever be set
  • Added benefit is that an exhaustion check is possible now that every case has been handled

Would it be possible to change these types to something more modern utilizing some newer TS features?

Full example found here: https://codesandbox.io/s/youthful-surf-j0mz3?file=/src/index.ts

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions