打字稿:不同文件中同一模块中的类可见的私有类

时间:2015-02-19 15:08:47

标签: typescript typescript1.4

我的项目使用了多文件内部模块'做法。在构建期间,所有内容都被编译为单个Javascript文件。

仍然困扰我的一件事是,我无法找到一种方法来拥有私有模块级别类(不会导出到定义文件),这些类仍然可以被驻留在单独文件中的同一模块中的类看到和使用(即C#内部课程)。有什么建议吗?

Foo.ts:

module shared {
  class Foo { 
  }
}

Bar.ts:

module shared {
  export class Bar { 
    constructor() {
      this.foo = new shared.Foo();
    }  
  }
}

Baz.ts:

module shared {
  export class Baz { 
    constructor() {
      this.foo = new shared.Foo();
    }  
  }
}

1 个答案:

答案 0 :(得分:2)

没有语言方面的解决方案。这就是为什么会出现这种情况的两个方面 - 代码的消费者看到了什么,以及JavaScript是如何发布的。

从发射方面,shared::Fooshared对象的导出成员,或者不是。如果未导出,则shared:Baz无法看到它,也无法使用它。因此,模块中的任何“内部”类显然都需要以发射方式导出。

从消费方面来说,这里有一个微妙的危险。让我们说这发生了:

// ** YourCode.d.ts **
declare module shared {
   class Bar { ... }
   class Baz { ... }
}

// ** SomeConsumer.ts **
// Hey, 'shared' is a good namespace!
module shared {
    // My own personal Foo
    export class Foo {
    }
}

刚刚发生了什么?您的代码的用户只是在没有意识到的情况下踩到shared.Foo成员。一切都会在运行时破坏。打破宇宙的一组危险成员是一个无证件的雷区。

最好的解决方案,如果你有一些应该在外部使用的成员,而另一些则不应该使用一个名为InternalImplementation的嵌套模块,以便消费者知道他们不应该实际上自己使用这些对象。