Microsoft/TypeScript

Module augmentation allows non-identical type parameters as long as there are defaults, but doesn't pass them

Open

#55.026 geöffnet am 14. Juli 2023

Auf GitHub ansehen
 (0 Kommentare) (2 Reaktionen) (0 zugewiesene Personen)TypeScript (6.726 Forks)batch import
BugDomain: BinderHelp Wanted

Repository-Metriken

Stars
 (48.455 Stars)
PR-Merge-Metriken
 (Durchschn. Merge 6T 17h) (9 gemergte PRs in 30 T)

Beschreibung

Bug Report

🔎 Search Terms

  • module augmentation
  • callback generic type

🕗 Version & Regression Information

Currently using typescript 5.1.6, but AFAIK this behavior was the same in previous versions. This also occurs on the Nightly.

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about generics (and the rest of the FAQ)

⏯ Playground Link

Playground link with relevant code

💻 Code

interface Chainable<Subject = any> {
    within(fn: (prevSubject: Subject) => Chainable<Subject>): Chainable<Subject>;
}

interface Chainable<Subject = any, ExtraType = undefined> {
    within(fn: (prevSubject: Subject, extra: ExtraType) => Chainable<Subject>): Chainable<Subject, ExtraType>;
}

interface ChainableLike<Subject = any, ExtraType = undefined> {
    within(fn: (prevSubject: Subject) => Chainable<Subject>): Chainable<Subject>;
    within(fn: (prevSubject: Subject, extra: ExtraType) => Chainable<Subject>): Chainable<Subject, ExtraType>;
}

type ChainableWithSecondType = Chainable<string, string>;
type Wrong = ChainableWithSecondType['within'];
type Correct = ChainableLike<string, string>['within'];

🙁 Actual behavior

If you omit the default on the added generic ExtraType, you get an error: All declarations of 'Chainable' must have identical type parameters. But when there's a default, it allows the type parameters to be different, but doesn't properly infer types. image

Typescript does not produce any errors, but when you mouseover Wrong, it shows the type of extra to be ExtraType. image

🙂 Expected behavior

Either TS should completely ban adding an optional extra type parameter, or it should properly infer type (i.e. mousing over Wrong should produce the same as mousing over Correct)

image

Contributor Guide