dechoD
tRPC3y ago
13 replies
decho

Incorrect type inference with discriminated unions.

Hey folks, I am having a really weird issue.

Here is a minimal reproducible example: https://tsplay.dev/WJB1kW

Basically I have a function that returns an object of the Difference, which is a union of 3 other types:

interface DifferenceCreate {
    type: "CREATE";
    value: any;
}

interface DifferenceRemove {
    type: "REMOVE";
    oldValue: any;
}

interface DifferenceChange {
    type: "CHANGE";
    value: any;
    oldValue: any;
}

export type Difference = DifferenceCreate | DifferenceRemove | DifferenceChange;

function myFunction(): Difference {
    return { type: 'CREATE', value: 1 }
}


I have created a router and a procedure that returns the result of myFunction. I then call this function on the client like this:

const test:Difference = await client.test.query();


However, I am getting a type error:

Type '{ type: "CREATE"; value?: any; } | { type: "REMOVE"; oldValue?: any; } | { type: "CHANGE"; value?: any; oldValue?: any; }' is not assignable to type 'Difference'.
  Type '{ type: "CREATE"; value?: any; }' is not assignable to type 'Difference'.
    Type '{ type: "CREATE"; value?: any; }' is not assignable to type 'DifferenceCreate'.
      Property 'value' is optional in type '{ type: "CREATE"; value?: any; }' but required in type 'DifferenceCreate'.


Any idea how to solve this issue?
A link shortener for the TypeScript Playground
Solution
GitHub
Provide environment information System: OS: Linux 6.5 Linux Mint 21.2 (Victoria) CPU: (24) x64 AMD Ryzen 9 7900 12-Core Processor Memory: 24.78 GB / 30.53 GB Container: Yes Shell: 5.8.1 - /bin/zsh ...
bug: Incorrect type inference with discriminated unions. · Issue #5...
Was this page helpful?