Microsoft/TypeScript

Distributive conditional types can't distribute over `NoInfer` types wrapping a union

Open

#61.076 aberto em 29 de jan. de 2025

Ver no GitHub
 (0 comments) (0 reactions) (0 assignees)TypeScript (6.726 forks)batch import
Domain: Conditional TypesHelp WantedPossible Improvement

Métricas do repositório

Stars
 (48.455 stars)
Métricas de merge de PR
 (Mesclagem média 6d 17h) (9 fundiu PRs em 30d)

Description

🔎 Search Terms

noinfer union distributive conditional distribution

🕗 Version & Regression Information

  • This is the behavior in every version I tried

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.8.0-dev.20250129&ssl=10&ssc=8&pln=1&pc=1#code/C4TwDgpgBAYg9nAogNwgO2FAvFA3lUSALigCIYB5C0qAXwG4AoQ6AIQEMAnFdTHfFiVKsAggCUaDRs3DQAkmjABXPrAQ8MUAD5QO3VBiYzIUMRADOSgDarEAD2Cd2AY2AAeBcuAAaNUgPAAHxMAPQhUBEAegD80iymFtbAAEzYUPaOLu4AcnAKAGYQnB6KKoG+8P68wYxhEVAxjEA

💻 Code

type FooEvent = { type: "FOO" };
type BarEvent = { type: "BAR" };

type Input = FooEvent | BarEvent;

type Result = Extract<Input, FooEvent>;
//   ^? type Result = { type: "FOO"; }

type Result2 = Extract<NoInfer<Input>, FooEvent>;
//   ^? type Result2 = never

🙁 Actual behavior

Result2 gets computed as never

🙂 Expected behavior

Result2 should get computed as { type: "FOO"; }

Additional information about the issue

This is repro for the core problem behind this incorrect behavior: TS playground

Guia do colaborador