2016-01-13 27 views
6

Esiste una strategia di risoluzione del modulo dattiloscritto che mi consenta di importare sia non iniziando con una barra e le importazioni da node_modules nello stesso modulo?risoluzione modulo dattiloscritto

Con "moduleResolution" impostato su "node" il compilatore non riesce a trovare i miei moduli locali, con tutte le altre opzioni non vede i moduli nella directory node_modules che sto tentando di importare.

Ho le seguenti importazioni nel mio file:

import {Injectable} from "angular2/core"; 
import {Logger} from "core/logging/Logger"; 

"angular2/core" si trova nel node_modules, "core/logging/Logger" è il mio modulo locale.

Penso che dovrebbe essere possibile, se si guarda il codice angolare sembrano avere entrambi, vale a dire. nel modulo http.ts: https://github.com/angular/angular/blob/master/modules/angular2/src/http/http.ts

import {Injectable} from 'angular2/core'; //this is local 
import {Observable} from 'rxjs/Observable'; //this probably comes from node_modules 

più di fondo informazioni:
Ho un progetto che consiste di due sottoprogetti:
- biblioteca
- app
Biblioteca definisce alcune utility che utilizza poi app. Il mio processo di compilazione crea innanzitutto il sottoprogetto "library", quindi lo copia (js compilato insieme ai file d.ts) nella sottocartella "library" in "node_modules" dell'app, quindi compila l'app.

In 'biblioteca' Ho le seguenti classi:

//file project/library/jsonparser/JSONParser.ts 
class JSONParser {...} 

//file project/library/services/ConfigurationService.ts 
import {JSONParser} from "../jsonparser/JSONParser" 
class ConfigurationService { 
    constructor(parser: JSONParser){ ... } 
} 

In 'app':

import {JSONParser} from "library/jsonparser/JSONParser" //this comes from node_modules in 'app' 
import {ConfigurationService} from "library/services/ConfigurationService" //from node_modules 
class AppConfigurationService extends ConfigurationService { 
    constructor(parser: JSONParser) { 
    super(parser); 
    } 
} 

Questo non compilerà il più presto JSONParser ha tutti i campi non pubblici (sono importati da due posti diversi, quindi per dattiloscritto questi sono due tipi diversi). Questo è il motivo per cui sto provando a importare i miei moduli due senza la barra all'inizio. Ma forse ci sono altre soluzioni a questo?

risposta

2

Penso che dovrebbe essere possibile, se si guarda il codice angolare sembrano avere entrambi, vale a dire. nel modulo http.ts: https://github.com/angular/angular/blob/master/modules/angular2/src/http/http.ts

Non banale.

Hanno risoluzione modulo classichttps://github.com/angular/angular/blob/6b73d09ba1d8c227d1b297341de2218aea5d1276/modules/angular2/tsconfig.json#L12

importazione {} osservabile da 'rxjs/Observable'; // probabilmente proviene da node_modules

Hanno una pipeline di build non banale specifica per loro che esegue il mapping su node_modules. Vedi: https://github.com/angular/angular/blob/851647334040ec95d1ab2f376f6b6bb76ead0d9a/tools/broccoli/broccoli-typescript.ts#L271