我正在尝试使用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需要有类型才能使用。
答案 0 :(得分:1)
在您的代码中RL.Tools.Opener
正在解析为new Opener();
实例上不存在静态public static Open()
,而是存在于class Opener
上,因此编译错误。
建议:不要让它静止。可能还有其他建议,但现在您知道错误的原因。
new ReqLib.Tools.Opener();
您需要执行new ReqLib().Tools.Opener;