2016-12-23 4 views
2

Eines der Probleme von moment-timezone besteht darin, dass es eine Warnung gibt, wenn Sie es mehrmals eingeben. Ich habe ein Modul, das die Zeitzone benötigt. Weil ich weiß nicht, ob wer Wille verwendet oder wird eingestellt nicht die Zeitzone themself, ich habe folgendes:Typoskript - Bedingt erforderlich

if (moment.tz === undefined) { 
    require('moment-timezone'); 
    moment.tz.setDefault('America/Los_Angeles'); 
} 

Dies funktioniert gut in normalen Javascript. Ich habe gerade experimentiert, um zu Typescript zu wechseln, und wenn ich das tue, bekomme ich den Fehler, dass Cannot find name 'require'.

wechselte ich diese Linie import momentTimezone = require('moment-timezone'); aber dann An import declaration can only be used in a namespace or module.

Was bekommen kann ich tun?

+1

ich denke, das könnte help you out: http://stackoverflow.com/questions/12742082/nodejs-require-inside-typescript-file – Matthijs

+0

@Matthijs, nein, ich sah das ursprünglich (das ist, wo der 'Import momentTimezone = ...' Versuch kam) . Aber das funktioniert auch nicht :( – Kousha

+0

Was ist der Ausführungskontext für diesen Code? Wenn dies im Browser ist, müssen Sie einen Modullader zur Verfügung haben, um sicherzustellen, dass Require definiert ist. Wenn dies im Knoten, Sie müssen entweder typings für die require-Funktion installieren (durch require oder node) ODER deklarieren, dass die Funktion wie im post @Matthijs referenziert – Paarth

Antwort

0

Die import foo = require ('foo') ist typoskriptspezifisch. Es führt zwei Dinge aus: Importieren Sie die Typdefinitionen in den Deklarationsbereich und das tatsächliche Modul in den Variablenbereich. Wenn Sie das importierte Modul an keiner Stelle verwenden und nur für Typings verwenden, wird es zur Laufzeit entfernt. Aber wenn Sie es im Variablen-Namespace verwenden, EJ eine Methode aufruft oder sie einer Variablen zuweist, erhalten Sie einen Runtimeimport. Das zu wissen ist sehr wichtig, denn es wird dich erstaunt retten.

Wenn Sie importieren möchten, und die Typdefinitionen verwenden und nur die eigentliche Modul importiert werden, wenn eine bestimmte Bedingung erfüllt ist, dann müssen Sie Typoskript der Import mit dem regulären erfordern wie folgt kombinieren:

import foo = require('foo'); 

export function loadFoo() { 
// This is lazy loading `foo` and using the original module *only* as a type annotation 
    var _foo: typeof foo = require('foo'); 
    // Now use `_foo` as a variable instead of `foo`. 
}