在ASP.NET项目

时间:2016-12-01 10:09:38

标签: .net asp.net-mvc typescript visual-studio-2015 .net-4.6

所以我正在研究这个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,我想使用它。这些天我只是拒绝做手工工作。我希望这个问题可以帮助像我这样的其他人。

由于

1 个答案:

答案 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中为我工作。这样做的附加好处是您可以在重新导出中省略或重命名某些类。您仍然需要将它们逐个添加到包装文件中,但这只需要完成一次。