构建类注册表:不能对类型缺少调用或构造签名的表达式使用“new”

时间:2016-09-19 16:39:21

标签: typescript tsc

我有这个设置:

print

我正在尝试做的是使用我想要的类给定类型的键构建一个字典,让我更改底层实现而不触及消费代码。这失败并显示以下消息

//./things/Base.ts
export default class Base{
  constructor(){
    console.log("HI I AM A BASE THING");
  }
}

//things.ts
import Base = require('./things/Base');

export = {
  defaultThing: Base
};

//entry.ts
import Things = require('./things');

new Things.defaultThing();

为什么这是正确的成语?

1 个答案:

答案 0 :(得分:12)

import Base = require(...)export default class Base的搭配不合适。

如果您将console.dir(Base)添加到things.ts,您会看到Base实际上是一个模块,而不是一个类:

{ __esModule: true, default: [Function: Base] }

如果您将things.ts中的导入更改为

import Base from './things/Base';

然后你的例子开始工作。

typescript language specification

中给出了解释
  

表单的导入要求声明

    import m = require("mod");
     

等同于ECMAScript 2015导入声明

    import * as m from "mod";

es6表单始终导入m作为模块,即使它包含默认导出。