TypeScript: las clases de módulos importados no son visibles
Estoy probando el compilador de TypeScript con múltiples módulos que se compilarían como módulos AMD.
Tengo un módulo "test" y un archivo separado que lo usará
test.ts:
export module test {
'use strict';
export class Person {
age:number = 0;
sin:number = 1;
}
var pp = new Person();
}
test.ts declara el módulo "test" y lo exporta. el archivo se compila y la salida de js es como se esperaba:
test.js:
define(["require", "exports"], function(require, exports) {
(function (test) {
'use strict';
var Person = (function () {
function Person() {
this.age = 0;
this.sin = 1;
}
return Person;
})();
test.Person = Person;
var pp = new Person();
})(exports.test || (exports.test = {}));
var test = exports.test;
})
Ahora en la misma carpeta hay test2.ts que estaría usando el módulo "test"
test2.ts:
///<reference path="test.ts"/>
import TT = module("test");
var p = TT.Person;
el compilador se queja aquí:
src/ts/test2.ts(5,11): La propiedad 'Person' no existe en el valor de tipo 'TT'
El archivo js de salida parece estar correcto sin embargo: test2.js:
define(["require", "exports", "test"], function(require, exports, __TT__) {
///<reference path="test.ts"/>
var TT = __TT__;
var p = TT.Person;
})
la versión del compilador es:
0.8.2.0
la línea de comandos es:
tsc --comments --declaration --target ES5 --module AMD $FilePath$
¿Cuál es el problema con el compilador aquí?
gracias.
Respuesta #1
Aquí está el código que necesitas...
import TT = module("test");
var p = new TT.test.Person();
Y una explicación rápida.
Cuando estás usando AMD o CommonJS para cargar tus módulos y estás usando declaraciones import, no necesitas usar comentarios reference. El import hace todo lo que necesitas.
Además, el propio archivo es el módulo, así que TT en tu código representa test.ts. Dentro de este archivo (que es un módulo) hay otro módulo explícitamente llamado test, así que de hecho tienes una estructura como esta: test.test.Person.
Podrías optar por simplemente usar el módulo de archivos y no añadir otro anidado, así:
test.ts
export class Person {
age:number = 0;
sin:number = 1;
}
var pp = new Person();
Esto te permitiría usar la versión no anidada, que es:
import TT = module("test");
var p = new TT.Person();
