打字稿定义文件内部模块

时间:2013-07-25 20:26:20

标签: typescript tsc

我有一组打印成*.d.ts文件的打字稿文件,但它对我来说仍然存在错误:

systems.debug.d.ts(280,41): error TS2094: The property 'Models' does not exist on value of type 'Systems'.

声明如下:

declare module Systems.Services.Stuff {
    class DefaultHubService {
        public Send(entry: Systems.Models.IEntry, successCallback: Function, failureCallback: Function): void;
    }
}

这发生在第280行(systems.debug.d.ts)上,它正在努力引用的是:

declare module Systems.Models {
    interface IEntry {
        Version: string;
        Content: KnockoutObservableString;
        DateCreated: KnockoutObservableDate;
        CreatorAccountId: KnockoutObservableString;
    }
}

这是在第239行(systems.debug.d.ts),所以我觉得很奇怪,不知道如何解决这个问题。由于界面是在服务之前包含的,因此除非有一些与Typescript的怪癖,否则它应该属于我的知识工作。任何人都可以对错误有所了解吗?

==编辑==

只是提供一些额外的信息,这有助于诊断问题...

实际实现如下:

// Systems/Services/Stuff/default-hub-service.ts
module Systems.Services.Stuff {
    export class DefaultHubService {
        public Send(entry: Models.IEntry, successCallback: Function, failureCallback: Function): void
        {
            // Do something here
        }
    }
}

// Systems/Models/ientry.ts
module Systems.Models {
    export interface IEntry {
        Version: string;
        Content: KnockoutObservableString;
        DateCreated: KnockoutObservableDate;
        CreatorAccountId: KnockoutObservableString;
    }
}

单个文件中没有引用,因为我有一个根级引用文件,其中包含要使用的所有外部引用,因为它首先包含在编译参数中,它提供了所有外部依赖项(即knockout.d.ts ,jquery.d.ts等。)

我正在使用Typescript 0.9.0.1,并通过直接从我的构建脚本调用tsc.exe进行编译。最后创建javascript输出文件没有错误,所以我有一个systems.debug.js编译好,但是声明标志只有d.ts文件抛出错误。

3 个答案:

答案 0 :(得分:1)

我在尝试您的代码时没有收到错误 - 这是我正在使用的完整示例:

declare class KnockoutObservableString {}
declare class KnockoutObservableDate {}

declare module Systems.Models {
    interface IEntry {
        Version: string;
        Content: KnockoutObservableString;
        DateCreated: KnockoutObservableDate;
        CreatorAccountId: KnockoutObservableString;
    }
}

declare module Systems.Services.Stuff {
    class DefaultHubService {
        public Send(entry: Systems.Models.IEntry, successCallback: Function, failureCallback: Function): void;
    }
}

var x = new Systems.Services.Stuff.DefaultHubService();
var y: Systems.Models.IEntry;

I tried this in the TypeScript Playground以及带有0.9.0.1 TypeScript Visual Studio扩展的Visual Studio。在Visual Studio中,我将环境声明分隔为名为systems.debug.d.ts的文件,并在app.ts中使用该声明。

答案 1 :(得分:1)

找出了导致它的原因!

哇,这是一个疯狂的......我不确定我完全理解它,因为我发现它是侥幸。

我有一个这样的文件:

module Systems.Services.Systems
{
    export class GameSystemService
    {
        // stuff
    }
}

现在,当你在打字稿操场上尝试时(因为它和我有同样的错误),我不小心删除了这个,所有错误都消失了。然后把它放回去并尝试删除其他人并且错误仍然存​​在......所以我知道它必须与此有关...

现在我假设错误是因为模块名称是Systems.Services.Systems并且在某种程度上它为此编译声明时,它会吓坏,因为它必须认为第二个Systems与第一个相同或者什么东西..我不太确定是什么导致Typescript炸毁其他一切,但我通过将其重命名为:

来修复它

module Systems.Services.GameSystems

然后一切正常。不确定这是否被归类为打字稿中的错误或我的编码问题,因为我不知道有任何问题有一个重复名称的命名空间......

无论如何修复它......疯了......感谢你的帮助!

答案 2 :(得分:0)

由于您要在多个步骤中进行编译,因此问题可能是 .d.ts 中未导出.d.ts定义,即您说a.d.ts为:

interface Foo{
   var boo:number;
}

你有一个.d.ts文件b.ts

///<reference path="a.d.ts"
   class Bar implements Foo{
      boo:number; 
   }

并编译为:

tsc a.d.ts b.ts --out out.js --declaration 

文件out.d.ts里面没有接口Foo。