microsoft / TypeScript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
https://www.typescriptlang.org
Apache License 2.0
100.65k stars 12.44k forks source link

Debug Failure. No error for last overload signature #60229

Open thomasballinger opened 3 hours ago

thomasballinger commented 3 hours ago

šŸ”Ž Search Terms

Debug Failure. No error for last overload signature

possibly related to

šŸ•— Version & Regression Information

āÆ Playground Link

Playground link

šŸ’» Code

// First copy of a library
type ComponentDefinitionExports<T> =
  T extends ComponentDefinition<infer Exports> ? Exports : never;

class InstalledComponent<Definition extends ComponentDefinition<any>> {
  get exports(): ComponentDefinitionExports<Definition> {
    return null as any;
  }
}

type ComponentDefinition<_Exports> = {
  use<Definition extends ComponentDefinition<any>>(
    definition: Definition
  ): InstalledComponent<Definition>;
};

function defineComponent(): ComponentDefinition<any> {
  return null as any as ComponentDefinition<any>;
}

const aggregate = defineComponent();

// Imagine another copy of the library

type ComponentDefinitionExports2<T> =
  T extends ComponentDefinition2<infer Exports> ? Exports : never;

class InstalledComponent2<Definition extends ComponentDefinition2<any>> {
  get exports(): ComponentDefinitionExports2<Definition> {
    return null as any;
  }
}

type ComponentDefinition2<_Exports> = {
  use<Definition extends ComponentDefinition2<any>>(
    definition: Definition
  ): InstalledComponent2<Definition>;
};

export type AppDefinition2 = {
  use<Definition extends ComponentDefinition2<any>>(
    definition: Definition
  ): InstalledComponent2<Definition>;
};

export function defineApp2(): AppDefinition2 {
  return null as any;
}

const app = defineApp2();
app.use(aggregate);

šŸ™ Actual behavior

tsc exits with error code 1 and write to stderr Debug Failure. No error for last overload signature

/Users/tomb/aggregate/node_modules/typescript/lib/tsc.js:113984
      throw e;
      ^

Error: Debug Failure. No error for last overload signature
    at resolveCall (/Users/tomb/aggregate/node_modules/typescript/lib/tsc.js:69834:19)
    at resolveCallExpression (/Users/tomb/aggregate/node_modules/typescript/lib/tsc.js:70216:12)
    at resolveSignature (/Users/tomb/aggregate/node_modules/typescript/lib/tsc.js:70599:16)
    at getResolvedSignature (/Users/tomb/aggregate/node_modules/typescript/lib/tsc.js:70619:20)
    at checkCallExpression (/Users/tomb/aggregate/node_modules/typescript/lib/tsc.js:70728:23)
    at checkExpressionWorker (/Users/tomb/aggregate/node_modules/typescript/lib/tsc.js:73819:16)
    at checkExpression (/Users/tomb/aggregate/node_modules/typescript/lib/tsc.js:73729:32)
    at checkExpressionStatement (/Users/tomb/aggregate/node_modules/typescript/lib/tsc.js:76310:5)
    at checkSourceElementWorker (/Users/tomb/aggregate/node_modules/typescript/lib/tsc.js:79237:16)
    at checkSourceElement (/Users/tomb/aggregate/node_modules/typescript/lib/tsc.js:79097:7)

In the playground,

Uncaught (in promise) Error: Debug Failure. No error for last overload signature
    at wR (tsWorker.js:341:318135)
    ...

šŸ™‚ Expected behavior

I'm not sure. I'd like this to pass typechecking.

Additional information about the issue

I tried to minimize this but I imagine this is not the minimal repro. Please give this a better title :)

MartinJohns commented 2 hours ago

Duplicate of #60202.

thomasballinger commented 2 hours ago

I don't think this is a dup of #60202, that one does not repro in 5.5.4 and below but this one does.