2012-10-07 24 views
10

He terminado de portar una biblioteca de JavaScript a TypeScript en Visual Studio 2012. En total, se trata de 60 clases, con cada clase definida en su propio archivo .ts.TypeScript: varios proyectos en la solución

Todas las clases se definen en el mismo módulo. Uso comentarios de referencia para reder a clases definidas en otros archivos. El diseño de cada archivo es el siguiente:

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

module MyModule { 

    export class MyClass { 
     ... 
    } 

} 

Ahora he creado un segundo proyecto en la misma solución que va a ser la aplicación real usando mi biblioteca recién portado. Tengo que incluir mi biblioteca de alguna manera y supongo que para eso es el sistema de módulos. Sin embargo, no estoy seguro de qué archivo (s) importar como MyModule está distribuido en docenas de archivos. ¿Es esto para lo que puedo usar el archivo .d.ts?

Además, para poder importar un módulo, tiene que ser declarado con la palabra clave 'export', pero si lo hago, ya no se encuentra por los comentarios de referencia.

Además de todo eso, ambos proyectos deben compilarse para que la salida del compilador pueda usarse fácilmente con un cargador de módulos como requireJS.

¿Cuál es el mejor enfoque para lograr todo esto?

¡Gracias!

Respuesta

9

Ok, entonces permítanme comenzar diciendo que "Módulo" puede significar cosas diferentes. Por ejemplo, existe el "patrón de módulo" que es lo que crea su "MyModule". Por lo que yo sé, TypeScript se refiere a estos como "Módulos Internos" en la especificación del idioma, y ​​estos difieren de los "Módulos Externos" que usted estaría cargando con algo como RequireJS. La principal diferencia es que los módulos externos esperan tener su propio entorno aislado con un objeto predefinido de "exportación" que puedan usar para exportar su funcionalidad.

Echa un vistazo a la salida de su módulo:

var MyModule; 
(function (MyModule) { 
    var MyClass = (function() { 
     function MyClass() { } 
     return MyClass; 
    })(); 
    MyModule.MyClass = MyClass;  
})(MyModule || (MyModule = {})); 

Ves que está exportando las cosas en "MyModule", que se hizo disponible a nivel mundial a otro script archivos que cargue con, por ejemplo, una bloque html "script". Siendo que usted mencionó que tiene 60 de estos, probablemente también podría configurar el compilador para generar un único archivo que podría incluir en el marcado, en lugar de cargar cada archivo uno por uno.

Cambiando de tema, echar un vistazo a lo que ocurre a la salida si cambia su declaración módulo de "MyModule módulo {...}" a "MyModule módulo de exportación {...}":

(function (MyModule) { 
    var MyClass = (function() { 
     function MyClass() { } 
     return MyClass; 
    })(); 
    MyModule.MyClass = MyClass;  
})(exports.MyModule || (exports.MyModule = {})); 

Como ve, su módulo sigue usando el "patrón de módulo" pero se le asigna como miembro de "exportaciones", lo que significa que debe cargarse, por ejemplo, con la función "requerir" del nodo.

En este caso, usted quiere utilizar realmente su módulo con este código:

import wrapper = module("./MyModule"); 
var instance = new wrapper.MyModule.MyClass(); 

Anote el nombre "./MyModule" en realidad se refiere a la nombre (menos la extensión .js) del El módulo está definido en (es por eso que VS decía que no podía encontrar esos módulos para usted).El código debe compilar a algo como:

var wrapper = require("./MyModule"); 
var instance = new wrapper.MyModule.MyClass(); 

Para añadir a esto, ya no es siquiera realmente necesita hacer nada con la palabra clave "módulo" de tener un módulo. Simplemente podría exportar una función:

// foo.ts 
export function foo() { 
    ... 
}; 

// some other file in the same dir 
import wrapper = module("./foo"); 
var result = wrapper.foo(); 

Esto funciona porque la función de 'foo' será asignado directamente a las "exportaciones", que será alias de "contenedor" en el otro archivo.

Para agregar más a este confuso desorden de cosas relacionadas con los módulos, también debo mencionar que los módulos AMD son diferentes porque se cargan de forma asíncrona, a diferencia del nodo "requiere". Para hacer que TypeScript genere esos, tendrá que pasar un parámetro "--module AMD" al compilador.

De todos modos, espero haber explicado la situación lo suficientemente bien como para poder averiguar qué es exactamente lo que necesita/desea. El tipo de módulos que termines usando realmente dependerá de cómo los uses ... es decir, nodo, web o alguna combinación de ambos.

+0

Gracias, esto fue muy útil. Terminé sin módulos externos después de todo: compilo la biblioteca en un gran archivo .js y la aplicación en otra y simplemente los cargo a través de secuencias de comandos. En los archivos fuente de la aplicación, uso comentarios de referencia en el archivo .d.ts de la biblioteca para que sus clases estén disponibles. – vexator

+0

¿hay alguna forma de cargar dos archivos en un contenedor? Defino viewmodels y export como clases en mis archivos de texto mecanografiado. Luego cuando importado siempre termino haciendo la importación wrapper1 = module ("file1"), import wrapper2 = module ("file2"); y luego el nuevo wrapper1.Viewmodel1() y el nuevo wrapper2.ViewModel2(). Sería bueno si todo pudiera estar bajo un módulo, viewmodels.Viewmodel1 y viewmodel.Viewmodel2. Para obtener esto, necesito exponer todas las clases de moedl de vista en el mismo archivo, lo que limita la visión general. –

+0

@ s093294 Han pasado meses desde que miré en texto mecanografiado, así que tenlo en cuenta. De todos modos, use '/// ' en la parte superior de 'file1.ts' y compile con' tsc --out file.js file1.ts'. El compilador detectará automáticamente que 'file1.ts' requiere' file2.ts' (gracias a la referencia) y lo compilará en un solo archivo javascript. Si bien no es exactamente la demostración perfecta para ti, mira: https://github.com/nxn/ModuleDemo - específicamente 'make.bat', los módulos 'Dirección' y 'Contactos' (implementados en varios archivos), y 'default.htm', que carga los archivos javascript compilados. – nxn

Cuestiones relacionadas