Wie importiere ich andere TypeScript-Dateien?


164

Wie kann ich bei Verwendung des TypeScript-Plugins für vs.net ein TypeScript-Dateiimportmodul in anderen TypeScript-Dateien deklarieren lassen?

Datei 1:

module moo
{
    export class foo .....
}

Datei 2:

//what goes here?

class bar extends moo.foo
{
}

Antworten:


202

Ab TypeScript Version 1.8 können Sie einfache importAnweisungen wie in ES6 verwenden:

import { ZipCodeValidator } from "./ZipCodeValidator";

let myValidator = new ZipCodeValidator();

https://www.typescriptlang.org/docs/handbook/modules.html

Alte Antwort: Ab TypeScript Version 1.5 können Sie Folgendes verwenden tsconfig.json: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html

Die Referenzierung des Kommentarstils entfällt vollständig.

Ältere Antwort:

Sie müssen auf die Datei oben in der aktuellen Datei verweisen.

Sie können dies folgendermaßen tun:

/// <reference path="../typings/jquery.d.ts"/>
/// <reference path="components/someclass.ts"/>

class Foo { }

etc.

Diese Pfade sind relativ zur aktuellen Datei.

Ihr Beispiel:

/// <reference path="moo.ts"/>

class bar extends moo.foo
{
}

1
Dies funktioniert jedoch gut, wenn ich den Code zu js kompiliere. Es gibt kein "Erfordernis" oder irgendeine Art von Link zu den externen Dateien. Nach dem, was ich in anderen Beispielen sehen kann, sollte ich ein "import moo = module (" moo ") ausführen. Es wird jedoch beanstandet, dass dies der Fall ist Kein Moo im aktuellen Umfang
Roger Johansson

2
Ja, referencegeneriert keinen js-Code, der js nach dem Kompilieren lädt. Es ist nur für den Compiler. Ich habe keine Erfahrung mit TypeScript und AMD, weil ich einfach die generierten JS-Dateien bündle, damit alles, was ich brauche, da ist. Aber ich sehe, was Sie brauchen, und Sie können hier mehr darüber lesen: typescriptlang.org/Content/… auf Seite 75 (Kapitel 9). Übrigens lohnt es sich, die gesamte Spezifikation zu lesen, sie ist im Vergleich zu anderen Sprachen relativ kurz.
Peter Porfy

3
Sie können das --allFlag mit tsc in Ihrer .ts-Hauptdatei verwenden. Der Compiler ermittelt alle Abhängigkeiten anhand Ihrer Referenz-Tags und generiert eine einzelne Ausgabe-JS-Datei für die gesamte Anwendung:tsc --out app.js main.ts
null

@ PeterPorfy gibt es eine Möglichkeit, die Referenz-Links mit T4MVC
Mark Macneil Bikeio

Beachten Sie, dass , wenn Typoskript erzählt zu erzeugen es2015(oder esnextModule), die Angabe der Dateierweiterung in der importAussage ist obligatorisch (es sei denn , Sie tun dies ). TypeScript fügt die Erweiterung nicht für Sie hinzu. Außerdem kann es im Moment nicht ausgegeben werden .mjs, so dass diese Erweiterung sein muss .js.
Dan Dascalescu

83

Typescript unterscheidet zwei verschiedene Arten von Modulen: Interne Module werden verwendet, um Ihren Code intern zu strukturieren. Zur Kompilierungszeit müssen Sie interne Module mithilfe von Referenzpfaden in den Geltungsbereich bringen:

/// <reference path='moo.ts'/>

class bar extends moo.foo {
}

Andererseits werden externe Module verwendet, um auf externe Quelldateien zu verweisen, die zur Laufzeit mit CommonJS oder AMD geladen werden sollen . In Ihrem Fall müssen Sie Folgendes tun, um das Laden externer Module zu verwenden:

moo.ts

export class foo {
    test: number;
} 

app.ts

import moo = module('moo');
class bar extends moo.foo {
  test2: number;
}

Beachten Sie die unterschiedliche Art und Weise, den Code in den Geltungsbereich zu bringen. Bei externen Modulen müssen Sie moduleden Namen der Quelldatei verwenden, die die Moduldefinition enthält. Wenn Sie AMD-Module verwenden möchten, müssen Sie den Compiler wie folgt aufrufen:

tsc --module amd app.ts

Dies wird dann zu kompiliert

var __extends = this.__extends || function (d, b) {
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
}
define(["require", "exports", 'moo'], function(require, exports, __moo__) {
    var moo = __moo__;

    var bar = (function (_super) {
        __extends(bar, _super);
        function bar() {
            _super.apply(this, arguments);

        }
        return bar;
    })(moo.foo);
})    

7
Ich fühle mich jetzt völlig verloren, egal was ich mache, der Compiler generiert eine separate .js für jede .ts-Datei und es gibt keinen "require" -Code in einer von beiden ... auch "import moo = module (" moo ") ); "gibt einen Fehler aus, dass der Name moo im aktuellen Bereich nicht vorhanden ist, wodurch der Modulteil (" moo ") hervorgehoben wird
Roger Johansson

Einige Punkte zur Verdeutlichung: Arbeiten Sie in Visual Studio? Haben Sie versucht, den Code, den ich in der Antwort angegeben habe, direkt mit tsc zu kompilieren? Haben Sie beide Dateien im selben Verzeichnis abgelegt?
Valentin

1
Ja, beim Kompilieren über die Befehlszeile befinden sich beide Dateien im selben Verzeichnis.
Roger Johansson

2
Ich habe Ihnen eine Pull-Anfrage gesendet. Bitte lassen Sie mich wissen, ob das funktioniert hat.
Valentin

12
perfekt :) für andere, die dies lesen: Module müssen auch exportiert werden, "Modul xxx exportieren"
Roger Johansson

20

Wenn Sie AMD-Module verwenden, funktionieren die anderen Antworten in TypeScript 1.0 (dem neuesten zum Zeitpunkt des Schreibens) nicht.

Je nachdem, wie viele Dinge Sie aus jeder .tsDatei exportieren möchten, stehen Ihnen verschiedene Ansätze zur Verfügung .

Mehrere Exporte

Foo.ts

export class Foo {}
export interface IFoo {}

Bar.ts

import fooModule = require("Foo");

var foo1 = new fooModule.Foo();
var foo2: fooModule.IFoo = {};

Einmaliger Export

Foo.ts

class Foo
{}

export = Foo;

Bar.ts

import Foo = require("Foo");

var foo = new Foo();

Ich mag den obigen Ansatz und finde, dass tsc.exe in diesem ersten Aufruf von define () korrekte Abhängigkeiten generiert, was GROSSARTIG ist! Das Problem für mich sind 2 separate Klassen, jede in ihrer eigenen Datei, jede in ein Exportmodul eingeschlossen - ich kann den "Import" durchführen, und eine könnte die andere verwenden, aber Klasse A kann von B erben, wobei immer noch die TypeScript-Erweiterungen verwendet werden irgendwie?
Samuel Meacham

@ SamuelMeacham, klar, ich verstehe nicht warum nicht. Wenn Sie immer noch Probleme haben, stellen Sie eine neue Frage und verlinken Sie sie hier. Ich werde einen Blick darauf werfen.
Drew Noakes

1
Das hat mich geklärt, jetzt ist alles super glatt. Abhängigkeiten, Vererbung, alles: stackoverflow.com/questions/21179144/…
Samuel Meacham

@SamuelMeacham beziehen Sie sich auf diese Seite oder den von Ihnen angegebenen Link, weil diese Antwort von Drew genau richtig zu sein scheint ...
Alexander Mills

Diese Antwort ist ziemlich veraltet (2014). Die aktuelle Syntax wird im Abschnitt Module des TypeScript-Handbuchs beschrieben.
Dan Dascalescu

18

Wenn Sie Module verwenden möchten und diese in eine einzelne JavaScript-Datei kompilieren möchten, haben Sie folgende Möglichkeiten:

tsc -out _compiled/main.js Main.ts

Main.ts

///<reference path='AnotherNamespace/ClassOne.ts'/>
///<reference path='AnotherNamespace/ClassTwo.ts'/>

module MyNamespace
{
    import ClassOne = AnotherNamespace.ClassOne;
    import ClassTwo = AnotherNamespace.ClassTwo;

    export class Main
    {
        private _classOne:ClassOne;
        private _classTwo:ClassTwo;

        constructor()
        {
            this._classOne = new ClassOne();
            this._classTwo = new ClassTwo();
        }
    }
}

ClassOne.ts

///<reference path='CommonComponent.ts'/>

module AnotherNamespace
{
    export class ClassOne
    {
        private _component:CommonComponent;

        constructor()
        {
            this._component = new CommonComponent();
        }
    }
}

CommonComponent.ts

module AnotherNamespace
{
    export class CommonComponent
    {
        constructor()
        {
        }
    }
}

Weitere Informationen finden Sie hier: http://www.codebelt.com/typescript/javascript-namespacing-with-typescript-internal-modules/


11

Ich würde es jetzt vermeiden, /// <reference path='moo.ts'/>nur für externe Bibliotheken zu verwenden, in denen die Definitionsdatei nicht im Paket enthalten ist.

Das reference pathbehebt Fehler im Editor, bedeutet aber nicht wirklich, dass die Datei importiert werden muss. Wenn Sie einen Gulp-Workflow oder JSPM verwenden, versuchen diese möglicherweise, jede Datei separat anstatt tsc -outin eine Datei zu kompilieren .

Aus Typescript 1.5

Stellen Sie einfach das, was Sie exportieren möchten, auf Dateiebene voran (Stammbereich).

aLib.ts

{
export class AClass(){} // exported i.e. will be available for import
export valueZero = 0; // will be available for import
}

Sie können auch später am Ende der Datei hinzufügen, was Sie exportieren möchten

{
class AClass(){} // not exported yet
valueZero = 0; // not exported yet
valueOne = 1; // not exported (and will not in this example)

export {AClass, valueZero} // pick the one you want to export
}

Oder mischen Sie sogar beide zusammen

{
class AClass(){} // not exported yet
export valueZero = 0; // will be available for import
export {AClass} // add AClass to the export list
}

Für den Import haben Sie 2 Möglichkeiten, zuerst wählen Sie erneut aus, was Sie wollen (eine nach der anderen)

anotherFile.ts

{
import {AClass} from "./aLib.ts"; // you import only AClass
var test = new AClass();
}

Oder die ganzen Exporte

{
import * as lib from "./aLib.ts"; // you import all the exported values within a "lib" object
var test = new lib.AClass();
}

Hinweis zu den Exporten: Wenn Sie doppelt denselben Wert exportieren, wird ein Fehler ausgegeben {export valueZero = 0; export {valueZero}; // valueZero ist bereits exportiert…}


Mir fehlten die geschweiften Klammern um den importierten Typ, daher wurde diese Zeile für mich behoben:import {AClass} from "./aLib.ts";
Samuel Slade

8

Seit TypeScript können 1.8+Sie einfache einfache importAnweisungen verwenden wie:

import { ClassName } from '../relative/path/to/file';

oder die Wildcard-Version:

import * as YourName from 'global-or-relative';

Lesen Sie mehr: https://www.typescriptlang.org/docs/handbook/modules.html


globaler Pfad wird unterstützt?
Vladimir Venegas

@VladimirVenegas Ich bin nicht sicher, ob das genau das ist, wonach Sie suchen, aber bitte schauen Sie hier: github.com/Microsoft/TypeScript/wiki/…
Szymon Dudziak

Für diejenigen, die gerade erst mit Typescript anfangen, ist dies die beste Antwort. Ein vollständiges Beispiel finden Sie unter: github.com/bitjson/typescript-starter
Jason Dreyzehner

3

verwendete eine Referenz wie "///<reference path="web.ts" /> und dann in den VS2013-Projekteigenschaften zum Erstellen von "app.ts", "Typescript Build" -> "Javascript-Ausgabe in Datei kombinieren:" (aktiviert) -> "app.js"


0
import {className} from 'filePath';

erinnere dich auch. Die Klasse, die Sie importieren, muss in die .ts-Datei exportiert werden.


Dies trägt nicht viel zu dieser älteren Antwort bei
Dan Dascalescu

-1

Schneller und einfacher Prozess in Visual Studio

Ziehen Sie die Datei mit der Erweiterung .ts per Drag & Drop vom Lösungsfenster in den Editor. Sie generiert Inline-Referenzcode wie ..

/// <reference path="../../components/someclass.ts"/>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.