2

I'm not sure if I'm structuring my typescript incorrectly so may be asking the wrong question here.

I've got 2 related classes 1 interfaces in separate files in the same folder.

I've wrapped them in a module because that feels like what I should do coming from C#.

This is all angularjs so it does it's own DI which might be important but probably isn't.

File 1:

export module Module1{
    export interface IService{
    }
}

File2:

export module Module1{
    export class Implementation implements IInterface{
    ...
    }
}

File 3 is angular code that uses the angular injected instance of IInterface. If I import File2 using require("./File2") it works but I'd rather import the whole of Module1, something like below, so I don't have to require each class individually (as this is obviously a simplified case).

import authModule = require('Module1');

var assetStreamApp = angular.module("[])
    .run(['IInterface'], (instance: IInterface) => {
        instance.doSomething();
    });

Is this possible?

I don't want to have to import every file individually and then choose a different alias for each "module" to namespace the types when it feels like I should be able to do that once.

Edit: After a little more reading I think I've worked out some of the terminology. I want to use typescript internal modules in a project but also use AMD modules as split points so I can use webpack's code splitting.

BenCr
  • 5,991
  • 5
  • 44
  • 68

1 Answers1

4

Ideally you should just use external modules and not mix internal with external modules.

This has been discussed in detail here and here.

I would recommend doing... IService.ts:

interface IService {
}

export = IService;

Implementation.ts:

import IInterface = require("./IInterface");

class Implementation implements IInterface{
...
}

export = Implementation;

And then import them appropriately into your file:

import IService = require("./IService");
import Implementation = require("./Implementation");

// use IService and Implementation here

Combining Multiple Modules into One Module

That being said, if you really wanted to, you could use IService.ts and Implementation.ts above and then create a file called Module1.ts where you import then export your modules like so:

export import IService = require("./IService");
export import Implementation = require("./Implementation");

Then in your code you can use it like such:

import Module1 = require("./Module1");

// use Module1.IService or Module1.Implementation here

Combining Multiple Modules with ES6 Modules

By the way, I wanted to point out that doing this is very convenient if you use ES6 modules...

IService.ts:

interface IService {
}

export default IService;

Implementation.ts:

import IInterface from "./IInterface";

export default class Implementation implements IInterface {
...
}

Module1.ts:

// re-export the modules
export {default as IService} from "./IService";
export {default as Implementation} from "./Implementation";

Then when you use this module you can easily access what you want out of it. Here are some example import statements:

// import only IService
import {IService} from "./Module1";
// import IService and Implementation
import {IService, Implementation} from "./Module1";
// or implement everything on a Module1 object
import * as Module1 from "./Module1";
Community
  • 1
  • 1
David Sherret
  • 101,669
  • 28
  • 188
  • 178
  • Thanks, I'll take a look at those links. What's the difference between that and `export interface IService`? – BenCr Sep 29 '15 at 20:40
  • @BenCr `export interface IService` will export it as a property of the module instead of it being the module itself. So by using `export = IService`, and `import IService` then `IService` is the actual interface. – David Sherret Sep 29 '15 at 20:44
  • Ahh, great, that simplifies the aliasing so I don't have to `import module = require('');` and then use `module.IService` everywhere. Great, thanks – BenCr Sep 29 '15 at 20:48