Typescript 生成类注册表:无法使用';新';其类型缺少调用或构造签名的表达式

Typescript 生成类注册表:无法使用';新';其类型缺少调用或构造签名的表达式,typescript,tsc,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('./thin

我有以下设置:

//./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();
我想做的是为给定类型的类构建一个字典,其中包含我想要的键,这样我就可以在不涉及使用代码的情况下更改底层实现。此操作失败,并显示以下消息

λ tsc entry.ts
entry.ts(3,1): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.

这是为什么?正确的习惯用法是什么?

import Base=require(…)
导出默认类库不兼容

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

{ __esModule: true, default: [Function: Base] }
如果将
things.ts
中的导入更改为

import Base from './things/Base';
然后,您的示例开始工作

有关解释见下表:

进口货物需要申报表

    import m = require("mod");
等同于ECMAScript 2015导入声明

    import * as m from "mod";

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

import Base=require(…)
导出默认类库
不兼容

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

{ __esModule: true, default: [Function: Base] }
如果将
things.ts
中的导入更改为

import Base from './things/Base';
然后,您的示例开始工作

有关解释见下表:

进口货物需要申报表

    import m = require("mod");
等同于ECMAScript 2015导入声明

    import * as m from "mod";

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

Nice!你知道为什么会这样吗?我的印象是,这个习语与你提出的解决方案是一样的。我想我找到了解释——把它添加到了答案尼斯!你知道为什么会这样吗?我的印象是,这个习语与你提出的解决方案是一样的。我想我找到了解释——把它添加到了答案中