Comment importer d'autres fichiers TypeScript?


164

Lors de l'utilisation du plug-in TypeScript pour vs.net, comment créer un module d'importation de fichier TypeScript déclaré dans d'autres fichiers TypeScript?

fichier 1:

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

fichier 2:

//what goes here?

class bar extends moo.foo
{
}

Réponses:


203

À partir de la version 1.8 de TypeScript, vous pouvez utiliser des importinstructions simples comme dans ES6:

import { ZipCodeValidator } from "./ZipCodeValidator";

let myValidator = new ZipCodeValidator();

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

Ancienne réponse: à partir de la version 1.5 de TypeScript, vous pouvez utiliser tsconfig.json: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html

Cela élimine complètement le besoin de référencer le style de commentaire.

Réponse plus ancienne:

Vous devez référencer le fichier en haut du fichier actuel.

Vous pouvez faire ceci comme ceci:

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

class Foo { }

etc.

Ces chemins sont relatifs au fichier courant.

Votre exemple:

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

class bar extends moo.foo
{
}

1
Cela fonctionne bien, cependant, lorsque je compile le code en js. il n'y a pas de "require" ou de lien vers les fichiers externes ... d'après ce que je peux voir sur d'autres exemples, je devrais faire un "import moo = module (" moo "); cependant, il se plaint qu'il y a pas de moo dans la portée actuelle
— Roger Johansson

2
Oui, referencene génère aucun code js qui charge ce js après la compilation. C'est juste pour le compilateur. Je n'ai pas d'expérience avec TypeScript et AMD car je regroupe simplement les fichiers js générés pour que tout ce dont j'ai besoin soit là. Mais je vois ce dont vous avez besoin et vous pouvez en savoir plus ici: typescriptlang.org/Content/… à la page 75 (chapitre 9). Btw cela vaut la peine de lire toute la spécification, c'est relativement court par rapport aux autres langages.
— Peter Porfy

3
Vous pouvez utiliser l' --allindicateur avec tsc sur votre fichier .ts principal. Le compilateur calcule toutes les dépendances en fonction de vos balises de référence et génère un seul fichier .js de sortie pour l'ensemble de l'application:tsc --out app.js main.ts
— null

@PeterPorfy est-il possible de taper fortement les liens de référence en utilisant T4MVC
— Mark Macneil Bikeio

Notez que si tapuscrit est dit de générer es2015(ou esnextmodules), en spécifiant l'extension de fichier dans la importdéclaration est obligatoire (sauf si vous faites cela ). TypeScript n'ajoutera pas l'extension pour vous. De plus, pour le moment, il ne peut pas sortir .mjs, donc cette extension doit l'être .js.
— Dan Dascalescu

83

Typescript distingue deux types de modules différents: Les modules internes sont utilisés pour structurer votre code en interne. Au moment de la compilation, vous devez amener les modules internes dans la portée en utilisant des chemins de référence:

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

class bar extends moo.foo {
}

D'autre part, les modules externes sont utilisés pour référencer les fichiers sources externes qui doivent être chargés au moment de l'exécution à l' aide de CommonJS ou AMD . Dans votre cas, pour utiliser le chargement de module externe, vous devez procéder comme suit:

moo.ts

export class foo {
    test: number;
} 

app.ts

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

Notez la manière différente d'intégrer le code dans la portée. Avec les modules externes, vous devez utiliser moduleavec le nom du fichier source qui contient la définition du module. Si vous souhaitez utiliser des modules AMD, vous devez appeler le compilateur comme suit:

tsc --module amd app.ts

Ceci est ensuite compilé en

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
Je me sens complètement perdu en ce moment, peu importe ce que je fais, le compilateur génère un .js séparé pour chaque fichier .ts et il n'y a pas de code "require" dans l'un ou l'autre ... aussi "import moo = module (" moo " ); "donne une erreur indiquant que le nom moo n'existe pas dans la portée actuelle, mettant en évidence la partie module (" moo ")
— Roger Johansson

Quelques points à clarifier ici: Travaillez-vous dans Visual Studio? Avez-vous essayé de compiler le code que j'ai donné dans la réponse en utilisant directement tsc? Avez-vous placé les deux fichiers dans le même répertoire?
— Valentin

1
oui, compilation à partir de la ligne de commande, les deux fichiers dans le même répertoire.
— Roger Johansson

2
J'ai bifurqué et vous ai envoyé une pull request. S'il vous plaît laissez-moi savoir si cela a fonctionné.
— Valentin

12
parfait :) pour les autres lisant ceci: les modules doivent aussi être exportés, "module d'exportation xxx"
— Roger Johansson

20

Si vous utilisez des modules AMD, les autres réponses ne fonctionneront pas dans TypeScript 1.0 (le plus récent au moment de la rédaction).

Vous disposez de différentes approches, en fonction du nombre d'éléments que vous souhaitez exporter à partir de chaque .tsfichier.

Exportations multiples

Foo.ts

export class Foo {}
export interface IFoo {}

Bar.ts

import fooModule = require("Foo");

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

Exportation unique

Foo.ts

class Foo
{}

export = Foo;

Bar.ts

import Foo = require("Foo");

var foo = new Foo();

J'aime l'approche ci-dessus et je trouve que tsc.exe génère des dépendances correctes dans cet appel initial à define (), ce qui est génial! Le problème pour moi est 2 classes distinctes, chacune dans son propre fichier, chacune enveloppée dans un module d'exportation - je peux faire l '"importation", et l'une pourrait utiliser l'autre, mais la classe A peut hériter de B, toujours en utilisant le TypeScript s'étend en quelque sorte?
— Samuel Meacham

@SamuelMeacham, bien sûr, je ne vois pas pourquoi. Si vous rencontrez toujours des problèmes, posez une nouvelle question et créez un lien vers celle-ci ici. Je regarderai.
— Drew Noakes le

1
Cela m'a arrangé, tout est super fluide maintenant. Dépendances, héritage, tout: stackoverflow.com/questions/21179144/…
— Samuel Meacham

@SamuelMeacham faites-vous référence à cette page ou au lien que vous avez fourni, car cette réponse de Drew semble sur place ...
— Alexander Mills

Cette réponse est assez dépassée (2014). La syntaxe actuelle est décrite dans la section Modules du manuel TypeScript.
— Dan Dascalescu

18

Si vous cherchez à utiliser des modules et que vous souhaitez les compiler dans un seul fichier JavaScript, vous pouvez effectuer les opérations suivantes:

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

Vous pouvez en savoir plus ici: http://www.codebelt.com/typescript/javascript-namespacing-with-typescript-internal-modules/


11

J'éviterais maintenant d'utiliser /// <reference path='moo.ts'/>mais pour les bibliothèques externes où le fichier de définition n'est pas inclus dans le package.

Le reference pathrésout les erreurs dans l'éditeur, mais cela ne signifie pas vraiment que le fichier doit être importé. Par conséquent, si vous utilisez un workflow gulp ou JSPM, ceux-ci peuvent essayer de compiler séparément chaque fichier au lieu d' tsc -outun fichier.

À partir de Typescript 1.5

Préfixez simplement ce que vous souhaitez exporter au niveau du fichier (portée racine)

aLib.ts

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

Vous pouvez également ajouter plus tard à la fin du fichier ce que vous souhaitez exporter

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

Ou même mélanger les deux ensemble

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

Pour l'importation vous avez 2 options, vous choisissez d'abord ce que vous voulez (une par une)

anotherFile.ts

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

Ou l'ensemble des exportations

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

Remarque concernant les exportations: exporter deux fois la même valeur provoquera une erreur {export valueZero = 0; export {valueZero}; // valueZero est déjà exporté…}


Il me manquait les accolades autour du type importé, donc cette ligne l'a corrigé pour moi:import {AClass} from "./aLib.ts";
— Samuel Slade

8

Depuis TypeScript, 1.8+vous pouvez utiliser des importinstructions simples et simples comme:

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

ou la version générique:

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

En savoir plus: https://www.typescriptlang.org/docs/handbook/modules.html


le chemin global est pris en charge ??
— Vladimir Venegas

@VladimirVenegas Je ne suis pas sûr que ce soit exactement ce que vous recherchez, mais jetez un œil ici: github.com/Microsoft/TypeScript/wiki/…
— Szymon Dudziak

Pour ceux qui viennent tout juste d'entrer dans Typescript, c'est la meilleure réponse. Pour un exemple complet, voir: github.com/bitjson/typescript-starter
— Jason Dreyzehner

3

utilisé une référence comme "///<reference path="web.ts" /> et puis dans les propriétés du projet VS2013 pour la construction de "app.ts", "Typescript Build" -> "Combine javascript output into file:" (coché) -> "app.js"



-1

Processus simple et rapide dans Visual Studio

Faites glisser et déposez le fichier avec l'extension .ts de la fenêtre de la solution à l'éditeur, il générera un code de référence en ligne comme ..

/// <reference path="../../components/someclass.ts"/>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.