Microsoft/TypeScript
Vedi su GitHubThe order of values in a union affects the correct type inference
Open
#59.729 aperta il 23 ago 2024
Domain: check: Type InferenceHelp WantedPossible ImprovementUnion Order Dependence
Metriche repository
- Star
- (48.455 star)
- Metriche merge PR
- (Merge medio 6g 17h) (9 PR mergiate in 30 g)
Descrizione
🔎 Search Terms
union order type infer
🕗 Version & Regression Information
This is the behavior in every version I tried, and I reviewed the FAQ for entries about union / order
⏯ Playground Link
💻 Code
type Message = { options?: Record<string, unknown> };
type Handler<T> = (message: T) => void;
declare function subscribe<T extends Message>(
payload:
| { message: T } & { handler: Handler<T> }
| { message: () => T } & { handler: Handler<T> }
): void;
subscribe({
message: () => ({ options: { market: 'market' } }),
handler: ({ options }) => {
// ^? Record<string, unknown>
},
});
🙁 Actual behavior
options type is Record<string, unknown>
🙂 Expected behavior
options type should be inferred as { market: string }
Additional information about the issue
if you reverse the order of values in the union:
declare function subscribe<T extends Message>(
payload:
| { message: () => T } & { handler: Handler<T> }
| { message: T } & { handler: Handler<T> }
): void;
then the type will be inferred correctly