microsoft/TypeScript

Excessive stack depth comparing types with TS 3.2

GabrielCastro opened this issue ยท 25 comments

TypeScript Version: 3.2.2

Search Terms:
error TS2321: Excessive stack depth comparing types
lodash

Code

import { PartialDeep, pick } from 'lodash';

type MapFunc<T> = (data: PartialDeep<T>) => PartialDeep<T>;

function testFunc<T>(): MapFunc<T> {
  return data => pick<PartialDeep<T>>(data, []) as PartialDeep<T>;
}
{
  "compilerOptions": {
    "target": "es2018",
    "module": "commonjs",
    "lib": ["es2018", "dom"],
    "strict": true,
    "noEmitOnError": true
  }
}

Expected behavior:
This code should compile with TS 3.2 as it will with TS 3.1

Actual behavior:
Compliation fails with the following error

error TS2321: Excessive stack depth comparing types 'PartialDeep<T>' and 'PartialDeep<PartialDeep<T>>'.


Found 2 errors. 

typescript@3.2.4

C:\dev\server\node_modules\ts-node\src\index.ts:261
return new TSError(diagnosticText, diagnosticCodes)
^
TSError: โจฏ Unable to compile TypeScript:
error TS2321: Excessive stack depth comparing types 'any' and 'ListIterateeCustom<T, boolean>'.
error TS2321: Excessive stack depth comparing types 'any' and 'ObjectIterateeCustom<T[], boolean>'.

I can confirm, that this issue still persists in TypeScript@3.2.4..
This thread, however, is a duplicate of #21592 .

This issue was introduced somehwere in 2.7.x - and has been moved from milestone to milestone to get fixed. Unfortunately, this has not been the case for now :(

Same issue here with TypeORM. :(

error TS2321: Excessive stack depth comparing types 'any' and 'FindConditions'.

I think, the TypeORM related issue is the most common threat, why people end up in this issue here, haha ;)

vitia commented

This issue is a deal breaker :-(

Can you guys please check it in the 0.2.15-rc.1 ? (npm i typeorm@0.2.15-rc.1)

EDIT: it works with npm i typescript@3.1.6


Unfortunately @pleerock I get the same with 0.2.15-rc.1 (TS 3.3.3333, ts-node: 8.0.3):

โ•ฐโ”€$ ts-node src/code/server.ts    
OR 
โ•ฐโ”€$ node -r ts-node/register src/code/server.ts
                                                                                                                                              1 โ†ต
error: uncaughtException: โจฏ Unable to compile TypeScript:
error TS2321: Excessive stack depth comparing types 'any' and 'FindConditions<TEntity> | undefined'.
 date=Sun Mar 10 2019 20:30:52 GMT+0000 (Greenwich Mean Time), pid=5728, uid=1000, gid=1000, cwd=/mnt/projects/projects/pickpeak/api, execPath=/usr/local/bin/node, version=v11.8.0, argv=[/devtools/npm-global/bin/ts-node, /mnt/projects/projects/pickpeak/api/src/code/server.ts], rss=440221696, heapTotal=364154880, heapUsed=257885040, external=87005, loadavg=[1.3564453125, 1.87939453125, 0.99951171875], uptime=409, trace=[column=12, file=/devtools/npm-global/lib/node_modules/ts-node/src/index.ts, function=createTSError, line=226, method=null, native=false, column=40, file=/devtools/npm-global/lib/node_modules/ts-node/src/index.ts, function=getOutput, line=335, method=null, native=false, column=11, file=/devtools/npm-global/lib/node_modules/ts-node/src/index.ts, function=Object.compile, line=368, method=compile, native=false, column=43, file=/devtools/npm-global/lib/node_modules/ts-node/src/index.ts, function=Module.m._compile, line=414, method=_compile, native=false, column=10, file=internal/modules/cjs/loader.js, function=Module._extensions..js, line=747, method=.js, native=false, column=12, file=/devtools/npm-global/lib/node_modules/ts-node/src/index.ts, function=Object.require.extensions.(anonymous function) [as .ts], line=417, method=ts], native=false, column=32, file=internal/modules/cjs/loader.js, function=Module.load, line=628, method=load, native=false, column=12, file=internal/modules/cjs/loader.js, function=tryModuleLoad, line=568, method=null, native=false, column=3, file=internal/modules/cjs/loader.js, function=Module._load, line=560, method=_load, native=false, column=17, file=internal/modules/cjs/loader.js, function=Module.require, line=665, method=require, native=false], stack=[TSError: โจฏ Unable to compile TypeScript:, error TS2321: Excessive stack depth comparing types 'any' and 'FindConditions<TEntity> | undefined'., ,     at createTSError (/devtools/npm-global/lib/node_modules/ts-node/src/index.ts:226:12),     at getOutput (/devtools/npm-global/lib/node_modules/ts-node/src/index.ts:335:40),     at Object.compile (/devtools/npm-global/lib/node_modules/ts-node/src/index.ts:368:11),     at Module.m._compile (/devtools/npm-global/lib/node_modules/ts-node/src/index.ts:414:43),     at Module._extensions..js (internal/modules/cjs/loader.js:747:10),     at Object.require.extensions.(anonymous function) [as .ts] (/devtools/npm-global/lib/node_modules/ts-node/src/index.ts:417:12),     at Module.load (internal/modules/cjs/loader.js:628:32),     at tryModuleLoad (internal/modules/cjs/loader.js:568:12),     at Function.Module._load (internal/modules/cjs/loader.js:560:3),     at Module.require (internal/modules/cjs/loader.js:665:17)]

Weirdly enough it works fine with just a $ tsc compilation.

The only way I could reproduce this issue is when I did gulp package (that does typescript compilation inside using gulp-typescript), using tsc is also fine to me. Then I changed some of the code (still valid typescript code, I just restructured something) and gulp compilation worked fine. I thought issue is fixed. @anodynos can you please provide some small reproduction where me (and maybe typescript team) can test this issue?

FYI update: I hope I get this tested during Easter with latest TypeScript & ts-node and create a small reproduction repo :-)

I confirm it works with typescript@3.1.6. I'm using that as a temporary workaround, since we were on typescript@3.3.4000 before. I've also tested with the latest version 3.4.3 and it's still broken.

For all the tests I was using typeorm@0.2.16

Just got hit by this in TS 3.6.2 which Renovate bot just attempted to update to and our pipeline failed. ):

It's not even our own code. It comes from one of the libraries that we use:

error TS2321: Excessive stack depth comparing types 'ElemMatch<?>' and 'ElemMatch<?>'.
error TS2321: Excessive stack depth comparing types 'InternalQuery<?>' and 'InternalQuery<?>'.
error TS2321: Excessive stack depth comparing types 'SiftQuery<?>' and 'SiftQuery<?>'.

https://github.com/crcn/sift.js/blob/ef8c5ca2e4b4277cf79085dd4168dbbe58ea4869/index.d.ts

P.S.: Maybe related? #21592

After upgrading to TS 3.6.2 got this error from a dependency library Typeorm as well. Reverting back to TS@3.5.3 and the issue went away.

node_modules/typeorm/repository/MongoRepository.d.ts:45:5 - error TS2321: Excessive stack depth comparing types '(optionsOrConditions?: string | number | Date | ObjectID | FindOneOptions<Entity> | Partial<Entity> | undefined, maybeOptions?: FindOneOptions<Entity> | undefined) => Promise<...>' and '{ (id?: string | number | Date | ObjectID | undefined, options?: FindOneOptions<Entity> | undefined): Promise<Entity | undefined>; (options?: FindOneOptions<Entity> | undefined): Promise<...>; (conditions?: FindConditions<...> | undefined, options?: FindOneOptions<...> | undefined): Promise<...>; }'.

45     findOne(optionsOrConditions?: string | number | Date | ObjectID | FindOneOptions<Entity> | Partial<Entity>, maybeOptions?: FindOneOptions<Entity>): Promise<Entity | undefined>;

Downgrading to TS@3.5.3 resolved the issue for me as well.

Im experiencing this in one of my projects. package.json had ^3.4.3 . Taking away the hat fixed the issue. Using it with loopback 4, so the error was:

error TS2321: Excessive stack depth comparing types 'HasManyRepository<?>' and 'HasManyRepository<?>'.

I confirm that typescript@3.1.6 solves this issue for TypeORM users (through NestJS).

Like @michaelharrisonroth we've just downgraded to typescript@3.5.3 to solve the issue.

Strange error. For me helped to change version of typescript.
f.e. project without node_modules and build.

  1. npm i (with typescript@3.5.3)
  2. npm run build it fails with related error
  3. npm i -D typescript@3.5.2
  4. npm run build it build with success

It works vice versa with no matter what version is it(except 3.6.2)

Same issue here ๐Ÿ˜Ž

Just had this issue occur for me while trying to build a typeorm project in AWS CodeBuild and locally in ubuntu 18.04:

Versions:
Node: v10.16.3 & v12.6.0
Typescript: 3.6.2
TypeORM: 0.2.16

Console output:
$ tsc -p .
error TS2321: Excessive stack depth comparing types 'FindConditions' and 'FindConditions'.

error TS2321: Excessive stack depth comparing types 'MongoRepository' and 'Repository'.

controller.ts:170:33 - error TS2589: Type instantiation is excessively deep and possibly infinite.

170 status: MoreThanOrEqual(1)
~~~~~~~~~~~~~~~~~~

node_modules/typeorm/repository/MongoRepository.d.ts:12:22 - error TS2589: Type instantiation is excessively deep and possibly infinite.

12 export declare class MongoRepository extends Repository {
~~~~~~~~~~~~~~~

node_modules/typeorm/repository/MongoRepository.d.ts:45:5 - error TS2321: Excessive stack depth comparing types '(optionsOrConditions?: string | number | Date | ObjectID | FindOneOptions | Partial, maybeOptions?: FindOneOptions) => Promise' and '{ (id?: string | number | Date | ObjectID, options?: FindOneOptions): Promise; (options?: FindOneOptions): Promise; (conditions?: FindConditions, options?: FindOneOptions<...>): Promise<...>; }'.

45 findOne(optionsOrConditions?: string | number | Date | ObjectID | FindOneOptions | Partial, maybeOptions?: FindOneOptions): Promise<Entity | undefined>;

Chiming in with the same error for new version of typeorm.

Node: v12.6.0
typeorm: v0.2.18
typescript: v3.6.2

Downgrading typescript v.3.5.3
And then using @babel/plugin-proposal-decorators for my needed 3.6 feature has worked for now.

Same issue here, wondering what is the meaning of such an issue...

same issue here with "typescript": "^4.2.3", node v10.16.0

here error appears on match

export function getCookie(key: string) {
  const matches = document.cookie.match(new RegExp(`(?:^|; )${key}=([^;]*)`));

  if (matches) {
    const [, match] = matches;
    const cookieValue = decodeURIComponent(match);
    return cookieValue;
  }
  return null;
}

EDIT :

fixed with Array.from :

export function getCookie(key: string) {
  const matches = document.cookie.match(new RegExp(`(?:^|; )${key}=([^;]*)`));

  if (matches) {
    const [, match] = Array.from(matches);
    const cookieValue = decodeURIComponent(match);
    return cookieValue;
  }
  return null;
}

same issue here, v4.7.4
image

playground

no error if i change the type to V extends unknown[]

Facing the same issue
Excessive stack depth comparing types

I am also facing this issue with Prisma when comparing two arraws with the types such as Prisma.<NameOfTheEntity>CreateInput[].