decho
decho
TtRPC
Created by decho on 12/24/2023 in #❓-help
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 }
}
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();
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?
14 replies