Jak zaimportować inne pliki TypeScript?


164

W przypadku korzystania z wtyczki TypeScript do usługi vs.net, jak utworzyć jeden moduł importu pliku TypeScript zadeklarowany w innych plikach TypeScript?

plik 1:

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

plik 2:

//what goes here?

class bar extends moo.foo
{
}

Odpowiedzi:


202

Od wersji TypeScript 1.8 możesz używać prostych importinstrukcji, tak jak w ES6:

import { ZipCodeValidator } from "./ZipCodeValidator";

let myValidator = new ZipCodeValidator();

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

Stara odpowiedź: Od wersji 1.5 TypeScript możesz użyć tsconfig.json: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html

Całkowicie eliminuje potrzebę odwoływania się do stylu komentarza.

Starsza odpowiedź:

Musisz odwołać się do pliku w górnej części bieżącego pliku.

Możesz to zrobić w ten sposób:

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

class Foo { }

itp.

Te ścieżki są względne w stosunku do bieżącego pliku.

Twój przykład:

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

class bar extends moo.foo
{
}

1
Działa to jednak dobrze, gdy kompiluję kod do js. nie ma „wymagania” ani żadnego odnośnika do plików zewnętrznych… z tego, co widzę na innych przykładach, powinienem zrobić „import moo = module („ moo ”); jednak narzeka, że ​​istnieje brak moo w obecnym zakresie
Roger Johansson

2
Tak, referencenie generuje żadnego kodu js, który ładuje ten plik js po kompilacji. To tylko dla kompilatora. Nie mam doświadczenia z TypeScript i AMD, ponieważ po prostu pakuję wygenerowane pliki js, więc wszystko, czego potrzebuję, jest tam. Ale widzę, czego potrzebujesz i możesz przeczytać więcej na ten temat tutaj: typescriptlang.org/Content/ ... na stronie 75 (rozdział 9). Warto przeczytać całą specyfikację, jest stosunkowo krótka w porównaniu z innymi językami.
Peter Porfy,

3
Możesz użyć --allflagi z tsc w swoim głównym pliku .ts. Kompilator oblicza wszystkie zależności w oparciu o znaczniki referencyjne i generuje pojedynczy plik wyjściowy .js dla całej aplikacji:tsc --out app.js main.ts
null

@PeterPorfy czy istnieje sposób, w jaki możemy mocno wpisać linki referencyjne za pomocą T4MVC
Mark Macneil Bikeio

Zauważ, że jeśli maszynopis dowiaduje się wygenerować es2015(lub esnext) modułów, określając rozszerzenie pliku w importoświadczeniu jest obowiązkowe (chyba że robisz to ). TypeScript nie doda rozszerzenia za Ciebie. Ponadto w tej chwili nie może wyświetlać .mjs, więc rozszerzenie musi być .js.
Dan Dascalescu

83

Maszynopis rozróżnia dwa różne rodzaje modułów: Moduły wewnętrzne służą do wewnętrznej strukturyzacji kodu. W czasie kompilacji musisz wprowadzić wewnętrzne moduły do ​​zakresu za pomocą ścieżek referencyjnych:

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

class bar extends moo.foo {
}

Z drugiej strony, moduły zewnętrzne służą do odwoływania się do zewnętrznych plików źródłowych, które mają być ładowane w czasie wykonywania przy użyciu CommonJS lub AMD . W Twoim przypadku, aby skorzystać z ładowania modułu zewnętrznego, musisz wykonać następujące czynności:

moo.ts

export class foo {
    test: number;
} 

app.ts

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

Zwróć uwagę na inny sposób uwzględnienia kodu w zakresie. W przypadku modułów zewnętrznych należy używać modulenazwy pliku źródłowego zawierającego definicję modułu. Jeśli chcesz używać modułów AMD, musisz wywołać kompilator w następujący sposób:

tsc --module amd app.ts

To jest następnie kompilowane do

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
W tej chwili czuję się kompletnie zagubiony, bez względu na to co robię, kompilator generuje osobny plik .js dla każdego pliku .ts i nie ma w nich żadnego kodu „wymagającego” ... także „import moo = module („ moo ” ); "wyświetla błąd, że nazwa moo nie istnieje w bieżącym zakresie, podświetlając część modułu (" moo ")
Roger Johansson

Kilka punktów do wyjaśnienia: Czy pracujesz w programie Visual Studio? Czy próbowałeś skompilować kod, który podałem w odpowiedzi, używając bezpośrednio tsc? Czy umieściłeś oba pliki w tym samym katalogu?
Valentin,

1
tak, kompiluję z linii poleceń, oba pliki w tym samym katalogu.
Roger Johansson,

2
Rozwidliłem i wysłałem ci prośbę o wycofanie. Daj mi znać, jeśli to zadziałało.
Valentin,

12
idealne :) dla innych czytających to: moduły też muszą zostać wyeksportowane, "export module xxx"
Roger Johansson

20

Jeśli używasz modułów AMD, inne odpowiedzi nie będą działać w TypeScript 1.0 (najnowszym w momencie pisania).

Masz do wyboru różne podejścia, w zależności od tego, ile rzeczy chcesz wyeksportować z każdego .tspliku.

Wielokrotny eksport

Foo.ts

export class Foo {}
export interface IFoo {}

Bar.ts

import fooModule = require("Foo");

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

Pojedynczy eksport

Foo.ts

class Foo
{}

export = Foo;

Bar.ts

import Foo = require("Foo");

var foo = new Foo();

Podoba mi się powyższe podejście i stwierdzam, że tsc.exe generuje poprawne zależności w tym początkowym wywołaniu funkcji define (), co jest WSPANIAŁE! Problemem dla mnie są 2 oddzielne klasy, każda w swoim własnym pliku, każda zapakowana w moduł eksportu - mogę zrobić "import" i jedna mogłaby użyć drugiej, ale klasa A może dziedziczyć po B, wciąż używając rozszerzeń TypeScript jakoś?
Samuel Meacham

@SamuelMeacham, jasne, nie rozumiem, dlaczego nie. Jeśli nadal masz problemy, zadaj nowe pytanie i link do niego tutaj. Spojrzę na to.
Drew Noakes

1
To mnie załatwiło, wszystko jest teraz super gładkie. Zależności, dziedziczenie, wszystko to: stackoverflow.com/questions/21179144/…
Samuel Meacham

@SamuelMeacham, czy odnosisz się do tej strony lub podanego przez Ciebie linku, ponieważ ta odpowiedź od Drew wydaje się być na miejscu ...
Alexander Mills,

Ta odpowiedź jest dość nieaktualna (2014). Bieżąca składnia jest opisana w sekcji Moduły podręcznika języka TypeScript.
Dan Dascalescu

18

Jeśli chcesz używać modułów i chcesz, aby kompilowały się do pojedynczego pliku JavaScript, możesz wykonać następujące czynności:

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()
        {
        }
    }
}

Możesz przeczytać więcej tutaj: http://www.codebelt.com/typescript/javascript-namespacing-with-typescript-internal-modules/


11

Unikałbym teraz używania, /// <reference path='moo.ts'/>ale dla bibliotek zewnętrznych, w których plik definicji nie jest zawarty w pakiecie.

W reference pathrozwiązuje błędy w edytorze, ale tak naprawdę nie oznacza potrzeby importowanego pliku. Dlatego jeśli używasz przepływu pracy gulp lub JSPM, mogą one próbować skompilować osobno każdy plik zamiasttsc -out jednego pliku.

Z maszynopisu 1.5

Po prostu wpisz przedrostek, który chcesz wyeksportować na poziomie pliku (zakres główny)

aLib.ts

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

Możesz także dodać później na końcu pliku to, co chcesz wyeksportować

{
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
}

Lub nawet połącz oba razem

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

W przypadku importu masz 2 opcje, najpierw wybierasz ponownie to, co chcesz (jedna po drugiej)

anotherFile.ts

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

Albo cały eksport

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

Uwaga dotycząca eksportu: eksport dwukrotnie tej samej wartości spowoduje błąd {export valueZero = 0; eksportuj {valueZero}; // wartość valueZero została już wyeksportowana…}


Brakowało mi nawiasów klamrowych wokół importowanego typu, więc ta linia naprawiła to za mnie:import {AClass} from "./aLib.ts";
Samuel Slade,

8

Od TypeScript 1.8+możesz użyć prostej prostej importinstrukcji, takiej jak:

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

lub wersja wieloznaczna:

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

Czytaj więcej: https://www.typescriptlang.org/docs/handbook/modules.html


globalna ścieżka jest obsługiwana?
Vladimir Venegas,

@VladimirVenegas Nie jestem pewien, czy dokładnie tego szukasz, ale spójrz tutaj: github.com/Microsoft/TypeScript/wiki/ ...
Szymon Dudziak

Dla tych, którzy dopiero zaczynają naukę Typescript, jest to najlepsza odpowiedź. Pełny przykład, patrz: github.com/bitjson/typescript-starter
Jason Dreyzehner

3

wykorzystał odniesienie, takie jak, "///<reference path="web.ts" /> a następnie we właściwościach projektu VS2013 do tworzenia „app.ts”, „Typescript Build” -> „Połącz wyjście javascript w plik:„ (zaznaczone) -> „app.js”



-1

Szybki łatwy proces w programie Visual Studio

Przeciągnij i upuść plik z rozszerzeniem .ts z okna rozwiązania do edytora, wygeneruje on wbudowany kod referencyjny, taki jak ...

/// <reference path="../../components/someclass.ts"/>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.