2

我有一组打字稿文件,它们被编译成一个*.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 文件会引发错误。

4

3 回答 3

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;

在 TypeScript Playground和带有 0.9.0.1 TypeScript Visual Studio Extension 的 Visual Studio 中尝试了这个。在 Visual Studio 中,我将环境声明分离到一个名为的文件systems.debug.d.ts中,并将该声明的使用放在app.ts.

于 2013-07-26T07:07:09.590 回答
1

找出是什么原因造成的!

哇,这太疯狂了……我不确定我是否完全理解它,因为我侥幸找到了它。

我有一个像这样的文件:

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

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

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

module Systems.Services.GameSystems

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

无论如何,它修复它......疯狂......感谢您的帮助!

于 2013-07-26T23:06:03.670 回答
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 。

于 2013-07-26T09:29:04.973 回答