这是错误堆栈:TypeError:XXX_1.Foo不是构造函数,因为运行时(编译良好)

时间:2019-07-19 22:42:52

标签: typescript webpack vscode-extensions commonjs

我正在用TypeScript编写VS代码扩展,并且试图导出一个类以在其他TS文件中使用。我已经能够很好地导出函数和接口,但是当我尝试将一个类导出到另一个TS文件时,它因错误而中断:

Here is the error stack:  TypeError: extension_1.Foo is not a constructor

Foo中类是extension.js的地方。

值得注意的是,所有这些都可以很好地编译,但是在运行时我会收到此错误。

我的课很简单:

export class Foo {
    constructor() {}
    public getValues(keys: string[] | undefined): string[] { return []; }
}

我通常会导入它:

import { Foo } from "../extension";

并实例化为

let foo = new Foo();

我的tsconfig.json看起来像

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6",
        "outDir": "out",
        "sourceMap": true,
        "strict": true,
        "rootDir": "src",
    },
    "exclude": [
        "node_modules",
        ".vscode-test"
    ]
}

我正在使用带ts-loader的webpack以及devDependencies:

 "devDependencies": {
        "@types/node": "^10.12.18",
        "@types/vscode": "^1.32.0",
        "ts-loader": "^6.0.4",
        "tslint": "^5.16.0",
        "typescript": "^3.5.1",
        "webpack": "^4.35.2",
        "webpack-cli": "^3.3.5",
        "vscode": "^1.1.34"
    }

我对所发生的事情感到困惑!

1 个答案:

答案 0 :(得分:1)

我看来我的问题是我有循环依赖!

shared-data.ts的简化版本如下:

import { SHARED_DATA_1 } from './shared-data-1.ts'

export class Foo {
   constructor(..) { };
   getValues(): string[] { ... };
}

export const SHARED_OBJ = { 
  key0: { 
     data1: 'hello world',
     data2: new Foo(..)
  },
  key1: SHARED_DATA_1,
  key2: SHARED_DATA_2
}

shared-data-1.ts如下:

import { Foo } from './shared-data.ts'
export const SHARED_DATA_1 = {
   data-1: new Foo()
}

一旦我将Foo移到其自己的文件./Foo.ts中,并将shared-data.tsshared-data-1.ts都更新为import { Foo } from './Foo.ts',一切都将正常进行。

我的实际依赖关系链要复杂一些,但这只是一个简化,解释了问题的症结所在。