node.js - Typescript internt modul på tvers av flere filer i Nodejs


Jeg har gått gjennom StackOverflow-innlegg og flere blogginnlegg, men jeg ser ikke ut til å finne svaret.

Jeg bruker VS Code, nodejs, typescript og gulp. Når jeg legger all koden for modulkontrollerne mine i en fil som dette:

 <controllers.ts>
 module Controllers {
    export class Api {
         get(controllerName:string):IController {
         }
    }   
 }

 module Controllers {
    export interface IController {
        performAction(actionName:string):any;
    }
 }

 module Controllers {
    export class ControllerBase implements IController {
        performAction(actionName:string):any {
    }
  }
}

module Controllers {
    export class UserController extends ControllerBase {
    }
}

export = Controllers;

Gulp kan kompilere det, og Node.js kjører det riktig.

Når jeg derimot deler det inn i flere filer, ser det ut til at jeg ikke får det til å kompilere:

<controllers.ts>
module Controllers {
    export class Api {
         get(controllerName:string):IController {
         }
    }   
}

module Controllers {
    export interface IController {
        performAction(actionName:string):any;
    }
}

module Controllers {
    export class ControllerBase implements IController {
        performAction(actionName:string):any {
        }
    }
}

export = Controllers;

<UserController.ts>
module Controllers {
    export class UserController extends ControllerBase {
    }
}

Jeg har prøvd å legge til

/// <reference path="./controllers.ts" /> 

til toppen av UserController.ts-filen min. Når jeg gjør det, kan den fortsatt ikke finne ControllerBase.

Jeg prøvde å gjøre

export class Controllers.UserController extends Controllers.ControllerBase

og det liker ikke Controllers før UserController, men hvis jeg fjerner den Controllers og får det til å se slik ut:

export class UserController extends Controllers.ControllerBase

da plasserer det åpenbart UserController i en annen modul.

Også, å importere det på denne måten:

import Controllers = require("./controllers");

ser heller ikke ut til å hjelpe. Jeg er ikke sikker på hva mer jeg kan prøve. All hjelp vil bli svært verdsatt. Det virker ikke som om dette ikke burde være oppnåelig.

Svar #1

Når man ser på å gjøre noe som dette, ser det ut til å være to problemer.

  1. Intellisense i ditt foretrukne kodeverktøy og
  2. Sammenstilling.

For mitt scenario er ikke intellisense et problem, fordi jeg ikke burde trenge intellisense på funksjonene i baseklassen for klassene som utvider baseklassen. Kompilering var min store utfordring. Her er løsningen jeg kom opp med. Jeg elsker den ikke, men den ser ut til å fungere.

var gulp = require('gulp');
var concat = require('gulp-concat');
var insert = require('gulp-insert');
var ts = require('gulp-typescript');
var del = require('del');

var tsOptions = {
    noImplicitAny: true,
    target: 'ES5',
    module: 'commonjs'
};

gulp.task('clean', function(done) {
    del(['./dest'], done);
})

gulp.task('compile-controllers', function() {
    return gulp.src(['./src/controllers.ts', './src/*.ts'])
               .pipe(concat('controllers.ts'))
               .pipe(insert.append('export = Controllers;'))
               .pipe(ts(tsOptions))
               .js
               .pipe(gulp.dest('dest/server'));
});

Svar #2

Typescript internt modul på tvers av flere filer i Nodejs

Ikke. Bruk eksterne moduler med kompilatorflagg --module commonjs i stedet: https://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1

Hvis du fortsatt ikke er overbevist, her er flere grunner: https://github.com/TypeStrong/atom-typescript/blob/master/docs/out.md

Relaterte artikler