2016-09-19 3 views
0

Ich habe dieses Setup:Aufbau einer Klasse Registrierung: Kann nicht ‚neu‘ verwenden, um mit einem Ausdruck, dessen Typ fehlt an oder konstruieren Unterschrift

//./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(); 

Was ich versuche zu tun, ein Wörterbuch mit den Tasten bauen Ich möchte für Klassen eines bestimmten Typs, lassen Sie mich die zugrunde liegende Implementierung ändern, ohne den verbrauchenden Code zu berühren. Dies schlägt mit der folgenden Meldung fehl

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

Warum ist das und was ist das richtige Idiom?

Antwort

8

import Base = require(...) passt nicht gut mit export default class Base.

Wenn Sie console.dir(Base)-things.ts hinzufügen, werden Sie sehen, dass Base tatsächlich ein Modul ist, keine Klasse: in things.ts zu

import Base from './things/Base'; 

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

Wenn Sie dann das Import ändern, um Ihre Beispiel beginnt zu arbeiten.

ist die Erklärung in den typescript language specification gegeben:

Eine Import erfordert Erklärung Form ist

import m = require("mod"); 

import * as m from "mod"; 
an die ECMAScript 2015 Einfuhranmeldung äquivalente

That es6 Formular importiert immer m als Modul, selbst wenn es den Standard-Export enthält.

+0

Schön! Weißt du, warum das passiert? Ich hatte den Eindruck, dass das Idiom genauso funktioniert wie Ihre vorgeschlagene Lösung –

+0

Ich denke, ich fand die Erklärung - fügte es der Antwort hinzu – artem

Verwandte Themen