Búsqueda de sitios web

¿Cómo puedo definir módulos dependientes en módulos AMD de TypeScript?


¿Cómo puedo definir los módulos dependientes en un Módulo AMD con TypeScript, incluyendo, por ejemplo, jQuery y underscore? Usando JavaScript hago, por ejemplo, así:

define('moduleA',
    ['jquery', 'underscore'], function ($, _) {
    }
});

¿Cómo puedo hacer esto para que el compilador de TypeScript genere este código?

Respuesta #1

Con la implementación actual del compilador (0.8), la manera de lograr lo que estás buscando es la siguiente.

test.ts:

import jquery = module("jquery");
import underscore = module("underscore");

export module A {
    console.log(jquery.$ + underscore._);
}

jquery.ts:

export var $ = null;

guion_bajo.ts:

export var _ = null;

si compilas test.ts usando la opción de módulo:

tsc --module AMD test.ts

generará el siguiente archivo JS para ti:

define(["require", "exports", "jquery", "underscore"], function(require, exports, __jquery__, __underscore__) {
    var jquery = __jquery__;
    var underscore = __underscore__;
    (function (A) {
        console.log(jquery.$ + underscore._);
    })(exports.A || (exports.A = {}));
})

Tenga en cuenta que si pone declaraciones de importación dentro del módulo, no generará el código correctamente debido a un error. El equipo está trabajando actualmente en una solución para ese problema, pero con suerte eso no debería bloquearlo.

Respuesta #2

Actualmente esto no funciona correctamente en TypeScript debido a un error en el compilador (ver stackoverflow). Lo que necesitarías hacer es definir un módulo moduleA que importe jquery y underscore, y luego compilarlo con -module amd. Básicamente, necesitarías los siguientes tres archivos:

moduleA.ts

export module moduleA {
    import jquery = module("jquery");
    import underscore = module("underscore");
    console.log(jquery.jquery);
    console.log(underscore.underscore);
}

jquery.ts

export module jquery {
    var jquery = "jquery";
}

underscore.ts

export module underscore {
    var underscore = "underscore";
}

Compilar esos tres archivos con tsc -module amd produce el siguiente código para moduleA.js:

define(["require", "exports"], function(require, exports) {
    (function (moduleA) {
        var jquery = __jquery__;

        var underscore = __underscore__;

        console.log(jquery.jquery);
        console.log(underscore.underscore);
    })(exports.moduleA || (exports.moduleA = {}));

})

Como dije arriba, debido a un error en el compilador, este código en realidad es incorrecto y se quejará de la falta de __jquery__ en tiempo de ejecución. Sin embargo, una vez que se corrija este error, el cargador amd de node.js debería poder cargar los módulos.

Artículos relacionados