Diğer TypeScript dosyalarını nasıl içe aktarırım?


164

Vs.net için TypeScript eklentisini kullanırken, diğer TypeScript dosyalarında bildirilen bir TypeScript dosyası içe aktarma modülünü nasıl yapabilirim?

dosya 1:

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

dosya 2:

//what goes here?

class bar extends moo.foo
{
}

Yanıtlar:


203

TypeScript sürüm 1.8'den importES6'daki gibi basit ifadeleri kullanabilirsiniz :

import { ZipCodeValidator } from "./ZipCodeValidator";

let myValidator = new ZipCodeValidator();

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

Eski yanıt: TypeScript 1.5 sürümünden şunları kullanabilirsiniz tsconfig.json: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html

Yorum stili referanslama ihtiyacını tamamen ortadan kaldırır.

Eski cevap:

Geçerli dosyanın üstündeki dosyaya başvurmanız gerekir.

Bunu şu şekilde yapabilirsiniz:

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

class Foo { }

vb.

Bu yollar geçerli dosyaya göredir.

Örneğiniz:

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

class bar extends moo.foo
{
}

1
Ben js kodu derlemek Ancak, bu iyi çalışıyor. "Örnek" veya harici dosyalara herhangi bir bağlantı yoktur ... diğer örneklerde görebildiğim kadarıyla, bir "import moo = module (" moo ") yapmalıyım; ancak, şimdiki kapsamda moo yok
Roger Johansson

2
Evet, referencederledikten sonra js yükleyen js kodu oluşturmaz. Sadece derleyici için. Sadece üretilen js dosyalarını paketlemek çünkü ihtiyacım olan her şey orada var çünkü TypeScript ve AMD ile deneyimim yok. Ama neye ihtiyacınız olduğunu görüyorum ve bunun hakkında daha fazla bilgiyi burada bulabilirsiniz: typescriptlang.org/Content/… sayfa 75 (bölüm 9). Tüm spesifikasyonu okumaya değer, diğer dillere kıyasla nispeten kısa.
Peter Porfy

3
--allBayrağı ana .ts dosyanızda tsc ile kullanabilirsiniz . Derleyici, referans etiketlerinize dayanarak tüm bağımlılıkları bulur ve tüm uygulama için tek bir çıktı .js dosyası oluşturur:tsc --out app.js main.ts
null

@PeterPorfy, T4MVC'yi kullanarak referans bağlantılarını güçlü bir şekilde yazabilmenin herhangi bir yolu var
Mark Macneil Bikeio

Typescript üretmek için söylenir eğer unutmayın es2015(veya esnextdosya uzantısını belirterek,) modülleri importaçıklamada ise zorunlu (yapmanız sürece bu ). TypeScript sizin için uzantı eklemez. Ayrıca, şu anda çıktı verilemiyor .mjs, bu yüzden uzantı olması gerekiyor .js.
Dan Dascalescu

83

Dakik yazı iki farklı modül türünü ayırt eder: Dahili modüller kodunuzu dahili olarak yapılandırmak için kullanılır. Derleme zamanında, dahili yolları referans yollarını kullanarak kapsam içine almanız gerekir:

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

class bar extends moo.foo {
}

Öte yandan, harici modüller, CommonJS veya AMD kullanılarak çalışma zamanında yüklenecek harici kaynak dosyalarını refere etmek için kullanılır . Sizin durumunuzda, harici modül yüklemesini kullanmak için aşağıdakileri yapmanız gerekir:

moo.ts

export class foo {
    test: number;
} 

app.ts

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

Kodu kapsama dahil etmenin farklı yolunu not edin. Harici modüllerde, modulemodül tanımını içeren kaynak dosyanın adıyla kullanmanız gerekir . AMD modüllerini kullanmak istiyorsanız, derleyiciyi aşağıdaki gibi aramanız gerekir:

tsc --module amd app.ts

Bu daha sonra derlenir

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
Şu anda tamamen kayboldum, ne yaparsam yapayım, derleyici her bir .ts dosyası için ayrı bir .js oluşturur ve ikisinde de "zorunlu" kod yoktur ... ayrıca "import moo = module (" moo ") ); "modül (" moo ") bölümünü vurgulayarak mevcut kapsamda moo adının bulunmadığı bir hata veriyor
Roger Johansson

Açıklığa kavuşturulması gereken birkaç nokta: Visual Studio'da mı çalışıyorsunuz? Cevapta verdiğim kodu doğrudan tsc kullanarak derlemeye çalıştınız mı? Her iki dosyayı da aynı dizine yerleştirdiniz mi?
Valentin

1
evet, komut satırından derlendiğinde, her iki dosya da aynı dizinde.
Roger Johansson

2
Çatalladım ve size bir çekme isteği gönderdim. Lütfen bunun işe yarayıp yaramadığını bana bildirin.
Valentin

12
mükemmel :) bunu okuyan diğerleri için: modüllerin de ihraç edilmesi gerekiyor, "ihracat modülü xxx"
Roger Johansson

20

AMD modüllerini kullanıyorsanız, diğer yanıtlar TypeScript 1.0'da (yazma sırasındaki en yenisi) çalışmaz.

Her .tsdosyadan kaç şeyi dışa aktarmak istediğinize bağlı olarak, kullanabileceğiniz farklı yaklaşımlarınız vardır .

Birden çok dışa aktarma

Foo.ts

export class Foo {}
export interface IFoo {}

Bar.ts

import fooModule = require("Foo");

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

Tek ihracat

Foo.ts

class Foo
{}

export = Foo;

Bar.ts

import Foo = require("Foo");

var foo = new Foo();

Yukarıdaki yaklaşım gibi ve tsc.exe BÜYÜK olan tanımlamak (), bu ilk çağrıda doğru bağımlılıklar üretiyor bulmak! Benim için sorun, her biri kendi dosyasında, her biri bir dışa aktarma modülüne sarılmış 2 ayrı sınıftır - "içe aktarma" yapabilirim ve biri diğerini kullanabilir, ancak A sınıfı B'den miras alabilir, hala TypeScript genişletmelerini kullanarak bir şekilde?
Samuel Meacham

@SamuelMeacham, elbette, neden göremiyorum. Hâlâ sorun yaşıyorsanız, yeni bir soru sorun ve buradan bağlantı verin. Bir bakacağım.
Drew Noakes

1
Bu beni halletti, şimdi her şey çok pürüzsüz. Bağımlılıklar, miras, hepsi: stackoverflow.com/questions/21179144/…
Samuel Meacham

@SamuelMeacham bu sayfaya veya verdiğiniz bağlantıya atıfta bulunuyorsunuz, çünkü Drew'dan gelen bu cevap yerinde görünüyor ...
Alexander Mills

Bu cevap oldukça eskidir (2014). Geçerli sözdizimi, TypeScript el kitabının Modüller bölümünde açıklanmaktadır .
Dan Dascalescu

18

Modülleri kullanmak istiyorsanız ve modülün tek bir JavaScript dosyasıyla derlenmesini istiyorsanız aşağıdakileri yapabilirsiniz:

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

Daha fazla bilgiyi buradan okuyabilirsiniz: http://www.codebelt.com/typescript/javascript-namespacing-with-typescript-internal-modules/


11

Şimdi kullanmaktan kaçınırdım /// <reference path='moo.ts'/>ama tanım dosyasının pakete dahil olmadığı harici kütüphaneler için.

reference pathÇözer editörü hatalar, ama gerçekten dosya ihtiyaçlarını anlamına gelmez ithal edilecek. Bu nedenle, gulp iş akışı veya JSPM kullanıyorsanız, bunlar bir dosya yerine her dosyayı ayrı olarak derlemeye çalışabilir tsc -out.

Daktilo Yazısı 1.5

Dosya düzeyinde dışa aktarmak istediğiniz şeyi önekleyin (kök kapsamı)

aLib.ts

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

Ayrıca daha sonra dışa aktarmak istediğinizi dosyanın sonuna ekleyebilirsiniz.

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

Veya ikisini birden karıştırın

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

İçe aktarma için 2 seçeneğiniz var, önce istediğinizi tekrar seçin (tek tek)

anotherFile.ts

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

Veya tüm ihracatlar

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

Dışa aktarmalarla ilgili not: aynı değerin iki kez dışa aktarılması bir hataya neden olur {export valueZero = 0; dışa aktarma {valueZero}; // valueZero zaten dışa aktarıldı…}


İthal tipin etrafındaki kıvırcık parantezleri kaçırıyordum, bu yüzden bu hat benim için düzeltti:import {AClass} from "./aLib.ts";
Samuel Slade

8

TypeScript'ten beri aşağıdaki gibi 1.8+basit basit bir importifadeyi kullanabilirsiniz :

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

veya joker sürüm:

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

Daha fazla bilgi edinin: https://www.typescriptlang.org/docs/handbook/modules.html


küresel yol desteklenir ??
Vladimir Venegas

@VladimirVenegas Tam olarak aradığınızdan emin değilim, ancak lütfen buraya bir göz atın: github.com/Microsoft/TypeScript/wiki/…
Szymon Dudziak

Şimdi yeni yazılanlar için en iyi cevap budur. Tam bir örnek için bkz. Github.com/bitjson/typescript-starter
Jason Dreyzehner

3

"///<reference path="web.ts" /> "app.ts", "Typescript Build" -> "Javascript çıktısını dosyada birleştir:" (işaretli) -> "app.js" oluşturmak için VS2013 proje özelliklerinde ve sonra bir başvuru kullandı


0
import {className} from 'filePath';

ayrıca hatırla. İçe aktardığınız sınıfın .ts dosyasında dışa aktarılması gerekir.


Bu mevcut daha eski cevaba
katmıyor

-1

Visual Studio'da Hızlı Kolay İşlem

Sürükleyip Bırakın .ts uzantılı dosya çözüm penceresinden editöre, gibi satır içi referans kodu oluşturur ..

/// <reference path="../../components/someclass.ts"/>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.