通常存储在应用程序中的Typescript接口在哪里?

时间:2014-07-16 14:38:00

标签: typescript

我有一个我编码的应用程序:

// File util.ts
class Util  { 
   // ....
   // ...
}
export = Util; 

// File base.ts
import Util = require('../../Utils/util'); 
class AdminBase extends Util {
    .... 
    isSelectedValue (data: IElement) {
        var title = data.text;
        var valueString = data.val.toString();
        it('Check for ' + data.text, function () {
            expect(element(by.id(data.id)).getAttribute("value")).toBe(valueString);
        });
    }
    ....
    ExamStatusId = {
        All: <IEnumElement>{
            id: this.examStatusSelectId,
            text: 'Exam Status: All',
            val: 0
        },
        Current: <IEnumElement>{
            id: this.examStatusSelectId,
            text: 'Exam Status: Current',
            val: 1
        }
    }
    ....
export = AdminBase; 

// File page.ts
class ExamPage extends AdminBase {
    ...
    ...
}
export = ExamPage;

// File test.ts
import ExamPage = require('./page'); 
var page = new ExamPage();
describe('Admin Exam Page test', function () {
   page.isSelectedValue(page.ExamStatusId.All);
});

这是我的界面:

interface IEnumElement {
    elem: string;
    text: string;
    val: number
}

有人可以在这样的Typescript应用程序中告诉我。我应该在哪里放置接口文件?接口是否与定义一起存储,如果是,那么我的应用程序将如何引用它们?

3 个答案:

答案 0 :(得分:4)

Typescript 接口可以放在任何地方,如您所愿。任何可以获得这些定义的地方都可以。

但这些只是 Typescript 一个......因为它们是设计时功能。它们不会转换/编译成任何JavaScript代码。

因此,如果有意义,请将它们放在单独的文件中,或者直接放在实现所在的文件中。没有“必须”规则......

即。将它们放在一个文件中并观察编译后会发生什么...... js文件将(几乎)为空

答案 1 :(得分:2)

由于您使用的是外部模块,我建议在顶级创建一个globals.ts语句,该文件将包含所有<{1}}您的export声明,这样您就不需要继续interface来获取接口信息。

您可以使用标准import标记(即

)引用此globals.ts文件
reference

BTW grunt-ts(https://github.com/grunt-ts/grunt-ts)如果您的打字稿文件中包含以下代码,则可以为您生成此参考代码:

/// <reference path="../globals.ts"/>

答案 2 :(得分:1)

除非我有两个或更多实现,否则我总是将接口放在与实际实现相同的文件中。在这种情况下,我有一个带有实现和接口子文件夹的“功能名称”文件夹。

当它在同一个文件中时,我把它放在顶部就像这样(这恰好就像一个角度服务):

module Project.Section.Feature.Service{
   export interface IFeatureService{
       method():void;
       propertyOne: number;
   }

   export class FeatureService implements IFeatureService{
       method(){
           //do stuff
       }

       propertyOne = 0;
   }
}

正如RadimKöhler的回答所说,最终它是非常随意的,因为它只对编译时的编译器有意义。在运行时,您将只从实现中获得JS。

对于多个实现,我只是将Interface放在同一个模块中,以便我可以轻松地引用它。像这样:

//file one
module Project.Section.Feature.Service{
   export interface IFeatureService{
       method():void;
       propertyOne: number;
   }
}

//file two
module Project.Section.Feature.Service{
    export class FeatureService implements IFeatureService{
       method(){
           //do stuff
       }

       propertyOne = 0;
   }

}

这使得您的代码看起来像在同一个命名空间中,因此您不必像implements Interfaces.IFeatureService那样装饰您的类。

编译器和智能感知将跟踪所有* .ts文件并了解您尝试执行的操作,并为您提供所有强类型的优点(至少在Visual Studio中)。