Skip to content

Recursive type alias in union type breaks in 3.8.3 #37344

Closed

Description

TypeScript Version: 3.8.3

Search Terms: recursive, recursion

Code

type Action<T, P> = P extends void ? { type : T } : { type: T, payload: P }

enum ActionType {
    Foo,
    Bar,
    Baz,
    Batch
}

type ReducerAction =
  | Action<ActionType.Bar, number>
  | Action<ActionType.Baz, boolean>
  | Action<ActionType.Foo, string>
  | Action<ActionType.Batch, ReducerAction[]>

Expected behavior: compiler does not complain recursive type alias, works fine in 3.7.5

Actual behavior: compiler complains recursive type alias, breaks in 3.8.3
Type arguments for 'Array' circularly reference themselves.

Playground Link:
http://www.typescriptlang.org/play/index.html#code/C4TwDgpgBAggxsAlgewHYB4AqAaKAFAPigF58oIAPYCVAEwGcoA3ZRWqAfigG8pRIoALiiYoAXyE8+4CMJxQwAQxAAbZItrC84gFA6aAVwC2sBClSYZPHVFtQAYsmTYbdgEKKATi7tQPALx93RWA4AAsdMT1+aAAlCFoDOAhPeCQ0ElcAH1N0jDTzS0gAOg9vKFRjACMUgmzc83QCtCKIUsVAqCqnFQhFVDrbHOb8sxaZYsdnKHpgT0RUAHNBqGGx0bzW9tCw3HjE5NT1gG0AXTqgA

Related Issues:
I'm not sure, if this might be related to #35017.

Activity

  1. stefanvonderkrone commented on Mar 13, 2020

    @stefanvonderkrone
    Author

    I must add that the recursive type definition of ReducerAction seems to break because of the conditionality of the Action type. If I remove the condition (type Action<T, P> = { type: T, payload: P }) then the type checking succeeds.

  2. weswigham commented on Mar 13, 2020

    @weswigham
    Member

    Aye. The conditional's check for simplifiability makes the circularly referential array type get resolved too soon. We should probably defer simplifying conditionals over deferred type references like we do generics.

  3. added
    BugA bug in TypeScript
    and removed
    Needs InvestigationThis issue needs a team member to investigate its status.
    on Mar 16, 2020
  4. locked as resolved and limited conversation to collaborators on Oct 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

BugA bug in TypeScriptFix AvailableA PR has been opened for this issue

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions