¿Cómo importo otros archivos TypeScript?


164

Cuando uso el complemento TypeScript para vs.net, ¿cómo hago para que un módulo de importación de archivos TypeScript se declare en otros archivos TypeScript?

archivo 1:

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

archivo 2:

//what goes here?

class bar extends moo.foo
{
}

Respuestas:


202

A partir de la versión 1.8 de TypeScript puede usar importdeclaraciones simples como en ES6:

import { ZipCodeValidator } from "./ZipCodeValidator";

let myValidator = new ZipCodeValidator();

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

Respuesta anterior: desde TypeScript versión 1.5 puede usar tsconfig.json: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html

Elimina por completo la necesidad de hacer referencia al estilo de comentario.

Respuesta anterior:

Debe hacer referencia al archivo en la parte superior del archivo actual.

Puedes hacer esto así:

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

class Foo { }

etc.

Estas rutas son relativas al archivo actual.

Su ejemplo:

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

class bar extends moo.foo
{
}

1
Sin embargo, esto funciona bien cuando compilo el código para js. no hay "requerir" o ningún tipo de enlace a los archivos externos ... por lo que puedo ver en otros ejemplos, debería hacer un "import moo = module (" moo "); sin embargo, se queja de que hay no moo en el alcance actual
— Roger Johansson

2
Sí, referenceno genera ningún código js que cargue ese js después de la compilación. Es solo para el compilador. No tengo experiencia con TypeScript y AMD porque simplemente empaqueto los archivos js generados para que todo lo que necesito esté allí. Pero veo lo que necesita y puede leer más sobre eso aquí: typescriptlang.org/Content/… en la página 75 (capítulo 9). Por cierto, vale la pena leer toda la especificación, es relativamente corto en comparación con otros idiomas.
— Peter Porfy

3
Puede usar la --allbandera con tsc en su archivo .ts principal. El compilador calcula todas las dependencias en función de sus etiquetas de referencia y genera un único archivo .js de salida para toda la aplicación:tsc --out app.js main.ts
— nulo

@PeterPorfy, ¿hay alguna forma de escribir los enlaces de referencia con T4MVC?
— Mark Macneil Bikeio

Tenga en cuenta que si se le indica a TypeScript que genere es2015(o esnext) módulos, importes obligatorio especificar la extensión del archivo en la declaración (a menos que haga esto ). TypeScript no agregará la extensión por usted. Además, por el momento, no puede salir .mjs, por lo que esa extensión tiene que ser .js.
— Dan Dascalescu

83

Typecript distingue dos tipos diferentes de módulos: los módulos internos se utilizan para estructurar su código internamente. En tiempo de compilación, debe llevar los módulos internos al alcance utilizando rutas de referencia:

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

class bar extends moo.foo {
}

Por otro lado, los módulos externos se utilizan para hacer referencia a los archivos de origen externos que se cargarán en tiempo de ejecución utilizando CommonJS o AMD . En su caso, para utilizar la carga de módulos externos, debe hacer lo siguiente:

moo.ts

export class foo {
    test: number;
} 

app.ts

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

Tenga en cuenta la forma diferente de incluir el código en el alcance. Con los módulos externos, debe usar moduleel nombre del archivo fuente que contiene la definición del módulo. Si desea utilizar módulos AMD, debe llamar al compilador de la siguiente manera:

tsc --module amd app.ts

Esto luego se compila a

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);
})    

77
Me siento completamente perdido en este momento, no importa lo que haga, el compilador genera un archivo .js separado para cada archivo .ts y no hay código "obligatorio" en ninguno de ellos ... también "import moo = module (" moo " ); "da un error de que el nombre muo no existe en el alcance actual, destacando la parte del módulo (" muu ")
— Roger Johansson

Algunos puntos para aclarar aquí: ¿Estás trabajando en Visual Studio? ¿Intentaste compilar el código que di en la respuesta usando tsc directamente? ¿Puso ambos archivos en el mismo directorio?
— Valentin

1
Sí, compilando desde la línea de comandos, ambos archivos en el mismo directorio.
— Roger Johansson

2
Te bifurqué y te envié una solicitud de extracción. Por favor, avíseme si eso funcionó.
— Valentin

12
perfecto :) para otros que lean esto: los módulos también deben exportarse, "export module xxx"
— Roger Johansson

20

Si está utilizando módulos AMD, las otras respuestas no funcionarán en TypeScript 1.0 (la más nueva en el momento de la escritura).

Tiene diferentes enfoques disponibles, dependiendo de cuántas cosas desee exportar desde cada .tsarchivo.

Exportaciones múltiples

Foo.ts

export class Foo {}
export interface IFoo {}

Bar.ts

import fooModule = require("Foo");

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

Exportación única

Foo.ts

class Foo
{}

export = Foo;

Bar.ts

import Foo = require("Foo");

var foo = new Foo();

Me gusta el enfoque anterior, y encuentro que tsc.exe está generando dependencias correctas en esa llamada inicial a define (), ¡lo cual es GENIAL! El problema para mí es 2 clases separadas, cada una en su propio archivo, cada una envuelta en un módulo de exportación: puedo hacer la "importación" y una podría usar la otra, pero la clase A puede heredar de B, aún usando las extensiones de TypeScript ¿de algun modo?
— Samuel Meacham

@SamuelMeacham, claro, no veo por qué no. Si aún tiene problemas, haga una nueva pregunta y haga un enlace aquí. Le daré un vistazo.
— Drew Noakes

1
Esto me solucionó, todo está súper suave ahora. Dependencias, herencia, todo: stackoverflow.com/questions/21179144/…
— Samuel Meacham

@SamuelMeacham te refieres a esta página o al enlace que proporcionaste, porque esta respuesta de Drew parece acertada ...
— Alexander Mills

Esta respuesta está bastante desactualizada (2014). La sintaxis actual se describe en la sección Módulos del manual de TypeScript.
— Dan Dascalescu

18

Si desea utilizar módulos y desea que se compile en un solo archivo JavaScript, puede hacer lo siguiente:

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

Puede leer más aquí: http://www.codebelt.com/typescript/javascript-namespacing-with-typescript-internal-modules/


11

Ahora evitaría usar /// <reference path='moo.ts'/>pero para bibliotecas externas donde el archivo de definición no está incluido en el paquete.

Los reference patherrores resuelve del editor, pero que en realidad no significa que las necesidades de archivos a importar. Por lo tanto, si está utilizando un flujo de trabajo de Gulp o JSPM, estos podrían intentar compilar por separado cada archivo en lugar de tsc -outun solo archivo.

De Typecript 1.5

Simplemente prefija lo que desea exportar a nivel de archivo (alcance raíz)

aLib.ts

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

También puede agregar más tarde al final del archivo lo que desea exportar

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

O incluso mezclar ambos juntos

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

Para la importación tiene 2 opciones, primero elige de nuevo lo que desea (uno por uno)

anotherFile.ts

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

O todas las exportaciones

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

Nota sobre las exportaciones: exportar dos veces el mismo valor generará un error {export valueZero = 0; export {valueZero}; // valueZero ya se exportó ...}


Me faltaban las llaves alrededor del tipo importado, por lo que esta línea me lo arregló:import {AClass} from "./aLib.ts";
— Samuel Slade

8

Desde TypeScript 1.8+puede usar una importdeclaración simple simple como:

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

o la versión comodín:

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

Leer más: https://www.typescriptlang.org/docs/handbook/modules.html


ruta global es compatible?
— Vladimir Venegas

@VladimirVenegas No estoy seguro de que sea lo que estás buscando exactamente, pero mira aquí: github.com/Microsoft/TypeScript/wiki/…
— Szymon Dudziak

Para aquellos que acaban de ingresar a Typecript, esta es la mejor respuesta. Para un ejemplo completo, consulte: github.com/bitjson/typescript-starter
— Jason Dreyzehner

3

usó una referencia como "///<reference path="web.ts" /> y luego en las propiedades del proyecto VS2013 para compilar "app.ts", "Typecript Build" -> "Combinar la salida de JavaScript en el archivo:" (marcado) -> "app.js"



-1

Proceso fácil y rápido en Visual Studio

Arrastre y suelte el archivo con la extensión .ts desde la ventana de la solución al editor, generará un código de referencia en línea como ...

/// <reference path="../../components/someclass.ts"/>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.