我可以将 TypeScript 类从我自己的模块导入到全局吗?

Posted

技术标签:

【中文标题】我可以将 TypeScript 类从我自己的模块导入到全局吗?【英文标题】:Can I import a TypeScript class from my own module to global? 【发布时间】:2014-09-11 17:46:13 【问题描述】:

我在一个模块中有一个类。

module Foo 
    export class Bar 

     

    /* Some more interfaces and classes to be used only in this module */

var bar = new Foo.Bar();

这个类是一个库,我不希望其他用户编写 Foo.Bar 而只是 Bar 来使用我的 Bar 类:

var bar = new Bar();

我可以通过定义一个新变量 Bar 来做到这一点。

var Bar = Foo.Bar;

var bar = new Bar();

但是,现在我有一个问题。我不能将 Bar 用作 TypeScript 类型标识符。

function something(bar: Bar)  // Compiler: Could not find symbol 'Bar'.


我也可以通过定义一个扩展 Foo.Bar 的新类来解决这个问题。

class Bar extends Foo.Bar 



var bar = new Bar();
function something(bar: Bar) 


但是,生成的 Bar 类与 Foo.Bar 并不完全相同,因为 Bar === Foo.BarBar.prototype === Foo.Bar.prototype 都返回 false

我试图找到一种使用 TypeScript 模块功能(例如 import 和 require)的方法,但我似乎无法使用它们。有什么好的方法可以将我的 Bar 类公开给全局吗?

【问题讨论】:

【参考方案1】:

我不确定你是否想要/需要一个模块,只需导出类:

class Bar 
   x: number;


/* Some more interfaces and classes to be used only in this module */

export = Bar;

然后在消费代码中:

import Bar = require('./Bar');
var bar = new Bar();

【讨论】:

这种方法似乎需要用户使用'require'。这不是问题,但我更喜欢让事情变得简单,import Bar = Foo.Bar 正是我想要的!谢谢你的回答:)【参考方案2】:

代替

interface Bar extends Foo.Bar 

var Bar = Foo.Bar;

你可以这样做:

import Bar = Foo.Bar;

完整示例:

module Foo 
    export class Bar 
        x: number
     

    /* Some more interfaces and classes to be used only in this module */


import Bar = Foo.Bar;

var bar = new Bar();
function something(bar: Bar) 


【讨论】:

简单多了!这就是我要的。非常感谢! 糟糕。生成的 d.ts 文件现在不包含 Bar 作为全局类对象。嗯…… d.ts 问题似乎在新编译器中得到修复。请参阅:github.com/Microsoft/TypeScript/issues/346 任何使用当前版本 1.1 编译器的人都应自行在 d.ts 文件中添加 import Bar = Foo.Bar; 行。【参考方案3】:

事实证明这是按预期工作的。

module Foo 
    export class Bar 
        x: number
     

    /* Some more interfaces and classes to be used only in this module */

interface Bar extends Foo.Bar 

var Bar = Foo.Bar;

var bar = new Bar();
function something(bar: Bar) 


谢谢!

【讨论】:

以上是关于我可以将 TypeScript 类从我自己的模块导入到全局吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法将类从一个模块导入到另一个模块 - Scala

7.5 Python 模块6-wordcloud库的使用

6.5 Python 模块5-jieba库的使用

如何在 TypeScript 中正确导出和导入模块

typescript 模块

我自己的 TypeScript 模块的“找不到模块”