我有一个我编码的应用程序:
// 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应用程序中告诉我。我应该在哪里放置接口文件?接口是否与定义一起存储,如果是,那么我的应用程序将如何引用它们?
答案 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中)。