Antes de que considere mi pregunta como duplicada, ya probé todo lo que respondió en otras preguntas y no tuve éxito. Déjame explicarte mi problema:
Tengo una aplicación Angular 2 y una API Express que comparten un paquete privado escrito en Typescript que contiene clases para mi dominio. Todos ellos están usando Typescript 2.2.2.
En el paquete priavte hay una clase que extiende otra clase en otro archivo y el proyecto compila. El problema ocurre cuando trato de usar el paquete en mi aplicación Angular: todo se rompe y la consola muestra TypeError: Object prototype may only be an Object or null: undefined .
Eso solo sucede si la clase secundaria está presente en el paquete; de lo contrario, todo funciona bien.
Ex:
// child/child.ts import { Parent } from '../parent/parent'; export class Child extends Parent { } // parent/parent.ts export class Parent { foo: string; } // bar/bar.ts import { Child } from '../child/child'; export class Bar { child: Child; }En el paquete privado, estoy usando Gulp para compilar Typescript a Javascript y generar el archivo de declaraciones.
Aquí está el archivo .tsconfig :
{ "compilerOptions": { "target": "es5", "noImplicitAny": true, "preserveConstEnums": true, "sourceMap": true, "experimentalDecorators": true, "typeRoots": ["../node_modules/@types"], "declaration": true, "removeComments": false }, "include": [ "**/**.ts" ], "exclude": [ "node_modules" ] } Aquí está el .gulpfile.js :
var gulp = require('gulp'); var ts = require('gulp-typescript'); var merge = require('merge2'); var tsConfig = ts.createProject('tsconfig.json', { declaration: true }); gulp.task("release", [], () => { var tsResult = gulp.src('src/**/**.ts') .pipe(tsConfig()); return merge([ tsResult.dts.pipe(gulp.dest('release/definitions')), tsResult.js.pipe(gulp.dest('release/js')) ]); });La estructura de mis archivos:
+ root | +--+ bar | | | +-- bar.ts | +--+ child | | | +-- child.ts | +--+ parent | +-- parent.ts He leído que podría haber un problema con la clasificación de los nombres de las clases al compilar, porque Parent debe compilarse antes que Child. La solución sería escribir la directiva /// <reference path="parent/parent"> en mi clase secundaria, pero cuando intento compilar falla y dice que la directiva de referencia no existe. Si escribo references en lugar de reference , se compila, pero los archivos js resultantes son los mismos, excepto por esa línea adicional, y no funcionan.
en su archivo tsconfig , no tiene una baseUrl , por lo que TypeScript no puede resolver esta importación en bar/bar.ts : import { Child } from 'child/child';
para resolver esto, debe cambiar su importación a la ruta relativa al archivo 'secundario'.
SI su estructura de directorios fuera
root --bar ----bar.ts --child ----child.tsentonces su archivo se convierte en:
// bar/bar.ts import { Child } from '../child/child'; // <--- export class Bar { child: Child; }