Skip to content

tsc and tsserver have different ideas of excessively deep types #32573

Open
@AnyhowStep

Description

@AnyhowStep

TypeScript Version:

typescript-3.6.0-insiders.20190725

https://typescript.visualstudio.com/cf7ac146-d525-443c-b23c-0d58337efebc/_apis/build/builds/37759/artifacts?artifactName=tgz&fileId=2A7E3F3E93DD6F833D63A63F3A7A21707B3F57B08FCA5C93A8F1848556D8141F02&fileName=/typescript-3.6.0-insiders.20190725.tgz

Taken from,
#32028 (comment)

Search Terms:

max instantiation count, max instantiation depth, tsc, tsserver

Code

I've reduced the 40-subproject monorepo to just small parts of 2 subprojects.

Here is a snippet of the problem,

/**
 *
 * ```json
 * //tsconfig-base.json
 * "disableSourceOfProjectReferenceRedirect": true,
 * ```
 *
 * ```json
 * //package.json
 * "typescript": "https://typescript.visualstudio.com/cf7ac146-d525-443c-b23c-0d58337efebc/_apis/build/builds/37759/artifacts?artifactName=tgz&fileId=2A7E3F3E93DD6F833D63A63F3A7A21707B3F57B08FCA5C93A8F1848556D8141F02&fileName=/typescript-3.6.0-insiders.20190725.tgz"
 * ```
 *
 * -----
 *
 * VS Code: OK!
 * Type inference OK!
 *
 * -----
 *
 * `tsc` gives me,
 *
 * ```js
 * src/blah.ts:11:21 - error TS2589: Type instantiation is excessively deep and possibly infinite.
 *
 *  11 export const json = tm.deepMerge(
 *                         ~~~~~~~~~~~~~
 *  12     base.json,
 *     ~~~~~~~~~~~~~~
 * ...
 *  31     s.convertBlahType.toStr.BLAH
 *     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *  32 );
 *     ~
 * ```
 */
export const json = tm.deepMerge(
  /*snip*/
);

const x = json("", "");
if (x.foo != undefined) {
    if (x.foo.bar != undefined) {
        //Correctly infers `string`
        //So, 14M type instantiations is okay with VS code
        x.foo.bar.baz
    }
}

Expected behavior:

If tsc gets the error,

TS2589: Type instantiation is excessively deep and possibly infinite.

Then tsserver should also get the error

Actual behavior:

tsc gets the error, but tsserver does not (or at least VS code infers the type correctly without errors)

Playground Link:

-None-

@sheetalkamat

The project involved contains code related to a company project.
So, I really do not want to upload it publicly, if possible.

I could mangle the variable names so that they're meaningless but if I can just email the parts of the project that are involved, that would be nice.

Repro steps:

  1. npm install
  2. npm run build
  3. See TS2589: Type instantiation is excessively deep and possibly infinite.
  4. Open VS code
  5. Navigate to file tsc says contains errors
  6. Notice no errors
  7. Play with return type of function
  8. Notice inference works correctly

Related Issues:

The merged PR that introduced the error,
#32079 (comment)

The build I am testing,
#32028

Also relevant, #29511
It seems like every few versions, there ends up being a difference between tsc and tsserver, regarding the max instantiation depth

Metadata

Metadata

Assignees

No one assigned

    Labels

    Needs InvestigationThis issue needs a team member to investigate its status.

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions