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

Car*_*ara 1 typescript tsc

我有这个设置:

//./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();
Run Code Online (Sandbox Code Playgroud)

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

? tsc entry.ts
entry.ts(3,1): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
Run Code Online (Sandbox Code Playgroud)

为什么这个和什么是正确的成语?

art*_*tem 12

import Base = require(...)与...混合不好export default class Base.

如果添加console.dir(Base)things.ts,你会看到,Base实际上是一个模块在那里,不是一类:

{ __esModule: true, default: [Function: Base] }
Run Code Online (Sandbox Code Playgroud)

如果您将该导入更改things.ts

import Base from './things/Base';
Run Code Online (Sandbox Code Playgroud)

然后你的例子开始工作了.

解释在typecript语言规范中给出:

导入需要声明表单

    import m = require("mod");
Run Code Online (Sandbox Code Playgroud)

相当于ECMAScript 2015导入声明

    import * as m from "mod";
Run Code Online (Sandbox Code Playgroud)

es6表单总是m作为模块导入,即使它包含默认导出.