Skip to content

Cannot widen type in generics while retaining knowledge of assignability #35257

Closed
@UselessPickles

Description

@UselessPickles

Search Terms:
generics widen type

Code

type Widen<T extends number | string> = T extends number
    ? number
    : T extends string
    ? string
    : T;

class Foo<T extends number | string> {
  public constructor(private readonly validValues: readonly T[]) { }

  // UNEXPECTED ERROR: T is not assignable to Widen<T>
  public isValidValue(value: Widen<T>): value is T {
    return this.validValues.indexOf(value as any) !== -1;
  }
}

Expected behavior:
The Widen type in my example widens number and string types. For any type T, T is assignable to Widen<T>. I expect to be able to rely on this fact in generics.

Actual behavior:
The assignability relationship of T and Widen<T> is lost when T is a generic type rather than a concrete type (see // UNEXPECTED ERROR comment in example).

Playground Link:
http://www.typescriptlang.org/play/?ssl=5&ssc=7&pln=5&pc=12#code/C4TwDgpgBA6glgEwgOwDwBUoQB7BQgZymQFcBbAIwgCcoAfKA4auZAcwD4oBeKTHPMkLFyVagCgoUqAH4RlGpOkAuPllz4iTFuyVS521mz1RV6ANzjxAYwA2AQwJEAYgHtXGdYOGkFtBobsXADeSmAkFLZw1lDWrsjaJNbArtQAFGAsAG72eFDUEPYI8bYgUDlRCABq9rYkEASqBUUlZegA2gC6AJRQwVAAvlZSAPQjUACqAHIAogAaAAozAMLoMwAiUDMAStsA8ttmUHBEyK7AUI4EcGzI9pHQKbCIKBgcYRFRMSc1lb-1aQq9VU8CQaHQHG6qiB0BOalC0nyEGAJGoyCgwAAFicAHQVRD-Bo41hIbB7ABmgNq9UuRHsyBAvQAhNxeABaACMlikQwGQA

Metadata

Metadata

Assignees

No one assigned

    Labels

    Design LimitationConstraints of the existing architecture prevent this from being fixed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions