尝试在TypeScript中获取命名空间行为以在RequireJS中工作

时间:2015-06-16 00:50:59

标签: requirejs typescript

我正在尝试使用TypeScript为一组相关网站创建公共库。我开始这样的代码:

module Lib {
    export module Tools {
        export class Opener {
            public Path: string;
            public static Open(): boolean { /* ... */ }
        }
        export class Closer { /* ... */ }
    }

    export module Controls {
        export class InfoDisplay { /* ... */ }
        export class Logon { /* ... */ }
    }

    export module Entities {
        export class BigThing { /* ... */ }
        export class LittleThing { /* ... */ }
    }
}

var Initial: boolean = Lib.Tools.Opener.Open();
var CustomOpener: Lib.Tools.Opener = new Lib.Tools.Opener();

这非常有效,并且允许我使用TypeScript的一些很好的功能,比如静态方法和命名空间的类名。然而,随着项目的发展,使用模块系统进行依赖性解析的需求已经变得清晰。我的问题是我是一个RequireJS菜鸟,所以我无法弄清楚一旦RequireJS混合在一起,如何保持上面提到的理想功能在我的项目中工作。这是迄今为止我最好的尝试(为了节省空间,只显示Opener的代码跟踪):

// ---- Opener.ts --------------------------------------------------------
/// <reference path="../typings/requirejs/require.d.ts"/>

class Opener {
    public Path: string;
    public static Open(): boolean { /* ... */ }
}

export = Opener;
// ---- Tools.ts --------------------------------------------------------
/// <reference path="../typings/requirejs/require.d.ts"/>

import Opener = require("./Opener");
import Closer = require("./Closer");

class Tools {
    public Opener: Opener = new Opener();
    public Closer: Closer = new Closer();
}

export = Tools;
// ---- ReqLib.ts --------------------------------------------------------
/// <reference path="../typings/requirejs/require.d.ts"/>

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

class ReqLib {
    public Tools: Tools = new Tools();
}

export = ReqLib;
// ---- App.ts --------------------------------------------------------
import ReqLib = require("./ReqLib");
var RL: ReqLib = new ReqLib();

var Initial: boolean = RL.Tools.Opener.Open();                       // <== red squiggles
var CustomerOpener: ReqLib.Tools.Opener = new ReqLib.Tools.Opener(); // <== red squiggles

Visual Studio不喜欢最后两行。它看不到第一行中的静态方法,它只是扁平化不喜欢第二行,因为它看起来像实例被用作类型。这也是一个更令人不安的案例,因为TypeScript需要有类型才能使用。

1 个答案:

答案 0 :(得分:1)

在您的代码中RL.Tools.Opener正在解析为new Opener(); 实例上不存在静态public static Open(),而是存在于class Opener上,因此编译错误。

建议:不要让它静止。可能还有其他建议,但现在您知道错误的原因。

更新

new ReqLib.Tools.Opener();您需要执行new ReqLib().Tools.Opener;