Requerir nodejs “child_process” con TypeScript, SystemJS y Electron

Estoy trabajando en un proyecto simple de nodejs electron (anteriormente conocido como atom shell). Lo estoy escribiendo usando angular 2, usando el proyecto con la misma configuración de proyecto que recomiendan en la documentación de typescript:

tsc:

{ "compilerOptions": { "target": "es5", "module": "system", "moduleResolution": "node", "sourceMap": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "removeComments": false, "noImplicitAny": false }, "exclude": [ "node_modules", "typings/main", "typings/main.d.ts" ] } 

Necesito ejecutar un comando, descubrí que puedo hacerlo con el nodo “child_process”. De todos modos, no pude encontrarlo para “importarlo” o “exigirlo” mientras se utiliza su tipo del archivo node.d.ts. He encontrado la interfaz “child_process” en el archivo node.d.ts que se adapta a mi necesidad, así es como se ve en el archivo node.d.ts:

  declare module "child_process" { import * as events from "events"; import * as stream from "stream"; export interface ChildProcess extends events.EventEmitter { stdin: stream.Writable; stdout: stream.Readable; stderr: stream.Readable; pid: number; kill(signal?: string): void; send(message: any, sendHandle?: any): void; disconnect(): void; unref(): void; } export function spawn(command: string, args?: string[], options?: { cwd?: string; stdio?: any; custom?: any; env?: any; detached?: boolean; }): ChildProcess; export function exec(command: string, options: { cwd?: string; stdio?: any; customFds?: any; env?: any; encoding?: string; timeout?: number; maxBuffer?: number; killSignal?: string; }, callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void ): ChildProcess; export function exec(command: string, callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void ): ChildProcess; export function execFile(file: string, callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void ): ChildProcess; export function execFile(file: string, args?: string[], callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void ): ChildProcess; export function execFile(file: string, args?: string[], options?: { cwd?: string; stdio?: any; customFds?: any; env?: any; encoding?: string; timeout?: number; maxBuffer?: number; killSignal?: string; }, callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void ): ChildProcess; export function fork(modulePath: string, args?: string[], options?: { cwd?: string; env?: any; execPath?: string; execArgv?: string[]; silent?: boolean; uid?: number; gid?: number; }): ChildProcess; export function spawnSync(command: string, args?: string[], options?: { cwd?: string; input?: string | Buffer; stdio?: any; env?: any; uid?: number; gid?: number; timeout?: number; maxBuffer?: number; killSignal?: string; encoding?: string; }): { pid: number; output: string[]; stdout: string | Buffer; stderr: string | Buffer; status: number; signal: string; error: Error; }; export function execSync(command: string, options?: { cwd?: string; input?: string|Buffer; stdio?: any; env?: any; uid?: number; gid?: number; timeout?: number; maxBuffer?: number; killSignal?: string; encoding?: string; }): string | Buffer; export function execFileSync(command: string, args?: string[], options?: { cwd?: string; input?: string|Buffer; stdio?: any; env?: any; uid?: number; gid?: number; timeout?: number; maxBuffer?: number; killSignal?: string; encoding?: string; }): string | Buffer; } 

pero solo puedo (como sé) obtener este tipo usando import:

 import * as child_process from 'child_process'; 

El único problema es que cuando hago esto, mi aplicación no se puede cargar y aparece el siguiente error en la consola:

 GET file:///C:/angular2Samples/NGW-electron-VS%20-%20TEMP/child_process net::ERR_FILE_NOT_FOUND 

Por ahora, me estoy moviendo usando:

 var child_process = require('child_process'); 

pero no pude encontrar de todos modos para agregar la información de tipo a esta var:

 var child_process : I_CANT_PUT_ANY_CHILD_PROCESS_TYPE_HERE = require('child_process'); 

¿Alguna idea sobre cómo puedo obtener el child_process (o cualquier otro módulo de nodo declarado que no sea una interfaz pública que pueda indicar después del operador “:”) con información de tipo?

Muchas gracias de antemano por cualquier ayuda y explicaciones 🙂

ACTUALIZACIÓN ————————————————- —————–

Como sugirió Tenbits, he añadido la referencia siguiente a la parte superior del archivo: ///

y usé la statement de importación que dijiste, pero no cambió mi cargador de módulos. Todavía no funcionó con el mismo error que se esperaba. No me siento muy cómodo cambiando el sistema de módulos, ya que mi proyecto utiliza angular 2 y sus documentos y algunas de sus guías dijeron que los nuevos proyectos que no tienen preferencia en este tema (soy muy nuevo en la escena de los cargadores de módulos y no lo soy). entendiendo completamente cómo funciona todavía). Cuando intenté cambiarlo, recibí algunos errores con respecto a los elementos angulares 2 con los que no tengo tiempo suficiente para entrar en este momento. ¿No debería haber una manera de hacerlo sin cambiar el cargador de módulos? echando un vistazo al sitio systemjs, dice al principio que es compatible con los módulos comunes : docs Systemjs

Realmente valoraría una solución que no cambia el sistema de módulos, o tal vez una explicación más detallada de lo que está sucediendo y qué enfoques para este tipo de problemas de carga de módulos existen por ahí

Ok, después de algunas investigaciones # L138 he encontrado la solución

Puedes usar import como antes

 import * as child from 'child_process'; var foo: child.ChildProcess = child.exec('foo.sh'); console.log(typeof foo.on); 

Pero debe configurar SystemJS para asignar el módulo a NodeJS .

 System.config({ map: { 'child_process': '@node/child_process' } }); 

¡Eso es!

Para mí funcionó con la callback para mostrar los resultados.

 import * as child from 'child_process'; var foo: child.ChildProcess = child.exec('dir', (error: string, stdout: string, stderr: string) => { console.log(stdout); }); 

No agregué ninguna asignación en SystemJS ya que no tengo tal configuración en la aplicación de nodo