tRPCttRPC
Powered by
dechoD
tRPC•3y 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
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 }
}
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
myFunction
. I then call this function on the client like this:

const test:Difference = await client.test.query();
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'.
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?
tsplay.dev
A link shortener for the TypeScript Playground
Solution
https://github.com/trpc/trpc/issues/5215
GitHub
bug: Incorrect type inference with discriminated unions. · Issue #5...
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...
Jump to solution
tRPCJoin
Move Fast & Break Nothing. End-to-end typesafe APIs made easy.
5,015Members
Resources
Recent Announcements

Similar Threads

Was this page helpful?

Similar Threads

Incorrect type errors
magicsponMmagicspon / ❓-help
3y ago
Complex type inference on router outputs?
ianIian / ❓-help
2y ago
Losing type inference in vs-code
La grande murailleLLa grande muraille / ❓-help
3y ago
Difference in type inference for vanilla client?
Jack FischerJJack Fischer / ❓-help
4y ago