所以我正在研究这个ASP.NET(.NET 4.6,VS2015),它在C#中编写了所有业务逻辑。但由于它不仅仅是演示文稿网,因此客户端上也会有很多逻辑。所以我使用TypeScript,因为它看起来像一个很棒的工具,可以帮助我用C#中习惯的样式组织我的客户端代码。
然而,随着我越来越深入,我发现TypeScript与C#完全不同。这一切都与一个问题有关:
TypeScript不支持简单的每个文件类(或每个文件的界面等)规则,您可以在其他文件中包含多个类(接口..)。
这真的会派上用场,因为我想为每个页面定义我的ViewModel类和初始化脚本,我将使用所有这些模型和工具。
Personaly,我发现了两个“解决方案”
答:保持每个文件的规则并将每个包装在一个名称空间中,如下所示:
// Analogy to c# using
import utils = App.Code.Utils;
namespace App.Code {
export class ZipCodeValidator {
public zipCode: string;
public validate(): boolean {
// I can use class from another
let stringValidator: utils.StringValidator = new utils.StringValidator();
// TODO validation
return true;
}
}
}
我从一开始就拿到了这个解决方案,我很满意。直到我发现有时编译文件的顺序是错误的。是的,我可以手动地继续引用其他文件(或者使用_references.ts),但对我而言,它就好像可以追溯到几年前。我将拥有文件的数据(感谢我的每个文件的规则)。
另外“他们说”我可以通过命名空间生成js文件,这也是一个很大的优势,所以我可以创建文件general.js,app.js和admin.js(你知道在哪里使用)。
B:第二种解决方案是“正确”使用模块。正如我所说,我可以这样写:
import { StringValidator } from "./Utils/StringValidator";
export default class ZipCodeValidator {
public zipCode: string;
public validate(): boolean {
// I can use class from another
let stringValidator: StringValidator = new StringValidator();
// TODO validation
return true;
}
}
但这意味着我需要手动导入每一个类。尽管intellisense使用这种方法无法正常工作,但如果省略“default”关键字,我还需要手动指定每个类。另外,我不知道如何根据目录将源分成不同的js文件。
好的,你可能会说我误解了TypeScript。一切都与模块有关,对吧?但我不会满足于“你需要在一个模块中定义所有类”。多数民众赞成不对。我可以继续使用JavaScript。
问题A:我需要手动跟踪所有文件并保持正确的顺序。
问题B:我需要按类导入所有类。解决方法是,如果我可以做类似
的事情import * as utils from "./utils/"
但据我所知,这是不可能的。
摘要
请你帮我推进正确的轨道?一些工具,可能是一些插件或任何东西?我喜欢TypeScript,我想使用它。这些天我只是拒绝做手工工作。我希望这个问题可以帮助像我这样的其他人。
由于
答案 0 :(得分:3)
我这样做的方法是使用方法B并使用模块。然后,我在包装器模块中收集所有常用模块,然后重新导出它们以便在其他模块中轻松导入。
一个例子:
AllUtils.ts
export * from './UtilClass1';
export * from './UtilClass2';
export { UtilClass3 as SomethingElse } from './UtilClass3';
这将允许使用单个import语句导入所有类,如下所示:
import * as utils from './AllUtils';
let myUtil = new utils.UtilClass1();
Intellisense使用这种方法在VS2015中为我工作。这样做的附加好处是您可以在重新导出中省略或重命名某些类。您仍然需要将它们逐个添加到包装文件中,但这只需要完成一次。