Skip to content

Exclude in typescript behaves differently when substitute with its definition #60973

Closed
@SHND

Description

@SHND

🔎 Search Terms

site:github.com/microsoft/TypeScript Exclude
site:github.com/microsoft/TypeScript Exclude behaves differently
TypeScript Exclude inconsistent
TypeScript Exclude different
TypeScript Exclude behaves differently expanded

🕗 Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about "Exclude" and "Distributive Conditional Types"

⏯ Playground Link

https://www.typescriptlang.org/play/?#code/C4TwDgpgBAsiAq4IEYoF4qoD5QExRwGYCoAWAKFElgSXw2J1JIFYSA2crq6AfQFEAHgGMANgFcAJhAA88ADRQAqgD50UeFAiDgEAHaSAzsqgB+KHogA3CACcoALg0BubkigAlCIfGjgqDAERCWkZOERIZEVwujUoKAB6BMwSXEp3Lx8-ehoIlC0dfSNcujMLaztHEsj4+KSUnHwiEgoeT29fYGIMAG0YyIBdAt0DY36IfHNLG3sncdRa+uw8EkYyLnqYAEMQACNoLb0oAEsAWzBbAHsbU-1gKAAzS-s9S70AWgBzfTtj4ShhFtDN5TOlqJlOsxegBpE5HeZDbQjYrjSblGZVWGLZL8DweADyHi4QA

💻 Code

type _Exclude<T, U> = T extends U ? never : T;

type MyType1 = 1 | 2 | 3 | 4
type MyType2 = 3 | 4 | 5 | 6

type Result1 = _Exclude<MyType1, MyType2>                   // 1 | 2
type Result2 = MyType1 extends MyType2 ? never : MyType1    // 1 | 2 | 3 | 4
type Result3 = [MyType1] extends MyType2 ? never : MyType1  // 1 | 2 | 3 | 4

// Maybe an improvement for non-generic cases?
type Result4 = [K in MyType1] extends MyType2 ? never : K   // ERROR

🙁 Actual behavior

Using "Distributive Conditional Types" in a generic type behaves differently compared to using concrete types. (Not Referential transparent)

🙂 Expected behavior

"Distributive Conditional Types" always works the same, no matter if it is being used in generic types or not.

Additional information about the issue

If "Distributive Conditional Types" should behave differently, I believe it worth providing a way for non-generic types to be able to distribute over the union type in conditional types, same as how it works in generics. Maybe having a syntax like:

type MyType1 = 1 | 2 | 3 | 4
type MyType2 = 3 | 4 | 5 | 6

type Result4 = [K in MyType1] extends MyType2 ? never : K

Metadata

Metadata

Assignees

No one assigned

    Labels

    Working as IntendedThe behavior described is the intended behavior; this is not a bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions