Skip to content

Stack overflow for subclass as static property #24194

Closed
@rjamesnw

Description

@rjamesnw

TypeScript Version:
2.8 and 2.9

Search Terms:
Out of stack space

Code

namespace Test {
    export interface IType<TInstance = object> {
        new(...args: any[]): TInstance;
    }

    export function ClassFactory<TBaseClass extends IType, TClass extends IType, TFactory extends IType, TNamespace extends object>
        (namespace: TNamespace, base: IClassFactory & { $__type: TBaseClass }, getType: (base: TBaseClass) => [TClass, TFactory], exportName?: keyof TNamespace, addMemberTypeInfo = true)
        : TClass & TFactory & { $__type: TClass } {
        return null;
    }

    export function FactoryBase<TClass extends IType, TBaseFactory extends IType, TStaticProperties extends keyof TClass>
        (type: TClass, baseFactoryType: TBaseFactory) {
        return class FactoryBase extends type {
            static 'new'?(...args: any[]): any;
            static init?(o: InstanceType<TClass>, isnew: boolean, ...args: any[]): void;
        };
    }

    export namespace Loader {
        export var SomeClass = ClassFactory(Loader, void 0,
            (base) => {
                class SomeClass {
                    private x: number;
                    protected static readonly 'SomeClassFactory' = class Factory extends FactoryBase(SomeClass, null) {
                        static 'new'(): SomeClass { return null; }
                        static init(o: SomeClass, isnew: boolean) {
                            o.x = 1;
                        }
                    };
                }
                return [SomeClass, SomeClass["SomeClassFactory"]];
            }
        );

    }
}

Configuration used:

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "suppressImplicitAnyIndexErrors": true,
    "traceResolution": true,
    "listFiles": true,
    "diagnostics": true,
    "forceConsistentCasingInFileNames": false,
    "noImplicitAny": true,
    "noEmitOnError": false,
    "removeComments": false,
    "noEmitHelpers": true,
    "declaration": true,
    "declarationDir": "wwwroot/js",
    //"typeRoots": [ "typings" ],
    "sourceMap": true,
    "target": "es5", // IE11=es5, Edge+ es2015=ES6
    "outDir": "wwwroot/js",
    "downlevelIteration": true,
    "rootDir": "Scripts", // *** location of the scripts ***
    "lib": [ "dom", "es6", "dom.iterable", "scripthost" ] // (target es5 but use es6 libs, since there is partial support of some es6 in es5; lib options: https://www.typescriptlang.org/docs/handbook/compiler-options.html)
  },
  "include": [
    "typings/**/*.ts",
    "Scripts/testscript.ts"
  ]
}

Compiled using this line:
tsc.exe --project "{path too source}\tsconfig.json" --locale en-US

Expected behavior:
Good behavior: Not out of stack space error.

Actual behavior:
Bad: Out of stack space error.

Playground Link:
https://goo.gl/UHStFt

This works PERFECT when this is commented out:

    "declaration": true,
    "declarationDir": "wwwroot/js",

I had to spend a lot of time whittling down the production source (many, many, files) down to this test. The production code this is taken from compiles AND runs PERFECT! Everyone is a happy camper (this code also compiles ok when declarations are turned off), BUT when I switch on declaration file generation, everything craps out (and the campers are not happy anymore). ;)

Metadata

Metadata

Assignees

Labels

BugA bug in TypeScriptFixedA PR has been merged for this issue

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions