Bagaimana cara mengimpor file TypeScript lainnya?


164

Saat menggunakan plugin TypeScript untuk vs.net, bagaimana cara membuat satu modul impor file TypeScript dideklarasikan di file TypeScript lainnya?

file 1:

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

file 2:

//what goes here?

class bar extends moo.foo
{
}

Jawaban:


202

Dari TypeScript versi 1.8 Anda dapat menggunakan importpernyataan sederhana seperti di ES6:

import { ZipCodeValidator } from "./ZipCodeValidator";

let myValidator = new ZipCodeValidator();

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

Jawaban lama: Dari TypeScript versi 1.5 Anda dapat menggunakan tsconfig.json: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html

Ini sepenuhnya menghilangkan kebutuhan referensi gaya komentar.

Jawaban yang lebih lama:

Anda perlu merujuk file di bagian atas file saat ini.

Anda dapat melakukan ini seperti ini:

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

class Foo { }

dll.

Jalur ini relatif terhadap file saat ini.

Contoh Anda:

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

class bar extends moo.foo
{
}

1
Ini berfungsi dengan baik, ketika saya mengkompilasi kode ke js. tidak ada "memerlukan" atau segala jenis tautan ke file eksternal ... dari apa yang dapat saya lihat pada contoh lain, saya harus melakukan "import moo = module (" moo "); namun, ia mengeluh bahwa ada tidak ada moo dalam lingkup saat ini
Roger Johansson

2
Ya, referencetidak menghasilkan kode js apa pun yang memuat js setelah dikompilasi. Ini hanya untuk kompiler. Saya tidak punya pengalaman dengan TypeScript dan AMD karena saya hanya bundel file js yang dihasilkan sehingga semua yang saya butuhkan ada di sana. Tetapi saya melihat apa yang Anda butuhkan dan Anda dapat membaca lebih lanjut tentang itu di sini: typescriptlang.org/Content/… di halaman 75 (bab 9). Btw layak membaca keseluruhan spesifikasi, ini relatif singkat dibandingkan dengan bahasa lain.
Peter Porfy

3
Anda dapat menggunakan --allflag dengan tsc pada file .ts utama Anda. Compiler menghitung semua dependensi berdasarkan pada tag referensi Anda dan menghasilkan file .js output tunggal untuk seluruh aplikasi:tsc --out app.js main.ts
null

@PeterPorfy apakah ada cara kita bisa mengetikkan tautan referensi menggunakan T4MVC
Mark Macneil Bikeio

Perhatikan bahwa jika TypeScript diberitahu untuk membuat es2015(atau esnext) modul, menentukan ekstensi file dalam importpernyataan itu wajib (kecuali Anda melakukan ini ). TypeScript tidak akan menambahkan ekstensi untuk Anda. Juga, saat ini, itu tidak bisa di-output .mjs, jadi ekstensi itu harus .js.
Dan Dascalescu

83

Script membedakan dua jenis modul: Modul internal digunakan untuk menyusun kode Anda secara internal. Pada waktu kompilasi, Anda harus membawa modul internal ke dalam lingkup menggunakan jalur referensi:

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

class bar extends moo.foo {
}

Di sisi lain, modul eksternal digunakan untuk mereferensikan file sumber eksternal yang akan dimuat saat runtime menggunakan CommonJS atau AMD . Dalam kasus Anda, untuk menggunakan pemuatan modul eksternal Anda harus melakukan hal berikut:

bulan

export class foo {
    test: number;
} 

app.ts

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

Perhatikan cara yang berbeda untuk memasukkan kode ke dalam cakupan. Dengan modul eksternal, Anda harus menggunakan moduledengan nama file sumber yang berisi definisi modul. Jika Anda ingin menggunakan modul AMD, Anda harus memanggil kompiler sebagai berikut:

tsc --module amd app.ts

Ini kemudian dikompilasi ke

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
Saya merasa benar-benar hilang sekarang, tidak peduli apa yang saya lakukan, kompiler menghasilkan .js terpisah untuk setiap file .ts dan tidak ada kode "wajib" di keduanya ... juga "import moo = module (" moo " ); "memberikan kesalahan bahwa nama moo tidak ada dalam lingkup saat ini, menyoroti bagian modul (" moo ")
Roger Johansson

Beberapa poin untuk diklarifikasi di sini: Apakah Anda bekerja di Visual Studio? Apakah Anda mencoba mengkompilasi kode yang saya berikan dalam jawaban menggunakan tsc secara langsung? Apakah Anda menempatkan kedua file di direktori yang sama?
Valentin

1
ya, kompilasi dari commandline, kedua file di direktori yang sama.
Roger Johansson

2
Saya telah bercabang dan mengirimi Anda permintaan tarik. Tolong beri tahu saya jika itu berhasil.
Valentin

12
sempurna :) untuk orang lain yang membaca ini: modul perlu diekspor juga, "export module xxx"
Roger Johansson

20

Jika Anda menggunakan modul AMD, jawaban lain tidak akan berfungsi di TypeScript 1.0 (yang terbaru pada saat penulisan.)

Anda memiliki pendekatan berbeda yang tersedia untuk Anda, tergantung pada berapa banyak hal yang ingin Anda ekspor dari setiap .tsfile.

Beragam ekspor

Foo.ts

export class Foo {}
export interface IFoo {}

Bar.ts

import fooModule = require("Foo");

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

Ekspor tunggal

Foo.ts

class Foo
{}

export = Foo;

Bar.ts

import Foo = require("Foo");

var foo = new Foo();

Saya suka pendekatan di atas, dan menemukan bahwa tsc.exe menghasilkan dependensi yang benar dalam panggilan awal untuk mendefinisikan (), yang HEBAT! Masalahnya bagi saya adalah 2 kelas yang terpisah, masing-masing dalam file mereka sendiri, masing-masing dibungkus dalam modul ekspor - Saya dapat melakukan "impor", dan satu dapat menggunakan yang lain, tetapi dapat kelas A mewarisi dari B, masih menggunakan TypeScript extends entah bagaimana?
Samuel Meacham

@SamuelMeacham, tentu, saya tidak mengerti mengapa tidak. Jika Anda masih mengalami masalah, ajukan pertanyaan baru dan tautkan ke sini. Aku akan melihatnya.
Drew Noakes

1
Ini membuat saya beres, semuanya super lancar sekarang. Ketergantungan, warisan, semuanya: stackoverflow.com/questions/21179144/…
Samuel Meacham

@SamuelMeacham Anda merujuk ke halaman ini atau tautan yang Anda berikan, karena jawaban dari Drew ini sepertinya tepat ...
Alexander Mills

Jawaban ini agak ketinggalan jaman (2014). Sintaksis saat ini dijelaskan di bagian Modul dari buku pegangan TypeScript.
Dan Dascalescu

18

Jika Anda ingin menggunakan modul dan ingin mengkompilasi ke file JavaScript tunggal Anda dapat melakukan hal berikut:

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

Anda dapat membaca lebih lanjut di sini: http://www.codebelt.com/typescript/javascript-namespacing-with-typescript-internal-modules/


11

Saya akan menghindari sekarang menggunakan /// <reference path='moo.ts'/>tetapi untuk perpustakaan eksternal di mana file definisi tidak termasuk ke dalam paket.

The reference pathmemecahkan kesalahan dalam editor, tetapi tidak benar-benar berarti kebutuhan file yang akan diimpor. Oleh karena itu jika Anda menggunakan alur kerja atau JSPM, mereka mungkin mencoba mengkompilasi secara terpisah setiap file alih-alih tsc -outke satu file.

Dari Typescript 1.5

Awali apa yang ingin Anda ekspor di tingkat file (cakupan root)

aLib.ts

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

Anda juga dapat menambahkan di akhir file apa yang ingin Anda ekspor

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

Atau bahkan mencampur keduanya

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

Untuk impor Anda memiliki 2 opsi, pertama Anda pilih lagi apa yang Anda inginkan (satu per satu)

anotherFile.ts

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

Atau seluruh ekspor

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

Catatan tentang ekspor: mengekspor dua kali nilai yang sama akan menimbulkan kesalahan {export valueZero = 0; ekspor {valueZero}; // valueZero sudah diekspor ...}


Saya kehilangan kurung kurawal di sekitar jenis impor, jadi baris ini memperbaikinya untuk saya:import {AClass} from "./aLib.ts";
Samuel Slade

8

Sejak TypeScript 1.8+Anda dapat menggunakan importpernyataan sederhana sederhana seperti:

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

atau versi wildcard:

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

Baca lebih lanjut: https://www.typescriptlang.org/docs/handbook/modules.html


jalur global didukung ??
Vladimir Venegas

@VladimirVenegas Saya tidak yakin apa yang Anda cari, tapi silakan lihat di sini: github.com/Microsoft/TypeScript/wiki/…
Szymon Dudziak

Bagi mereka yang baru saja masuk ke dalam Filescript, ini adalah jawaban terbaik. Untuk contoh lengkap, lihat: github.com/bitjson/typescript-starter
Jason Dreyzehner

3

menggunakan referensi seperti "///<reference path="web.ts" /> dan kemudian di properti proyek VS2013 untuk membangun "app.ts", "Membangun ScriptScript" -> "Gabungkan output javascript ke file:" (dicentang) -> "app.js"



-1

Proses Cepat dan Mudah di Visual Studio

Seret dan Jatuhkan file dengan ekstensi .ts dari jendela solusi ke editor, ini akan menghasilkan kode referensi sebaris seperti ..

/// <reference path="../../components/someclass.ts"/>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.