【问题标题】:Typescript definition files internal modules打字稿定义文件内部模块
【发布时间】:2013-07-25 20:26:19
【问题描述】:

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

【问题讨论】:

    标签: typescript tsc


    【解决方案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;
    

    tried this in the TypeScript Playground 并且还在 Visual Studio 中使用 0.9.0.1 TypeScript Visual Studio 扩展。在 Visual Studio 中,我将环境声明分离到一个名为 systems.debug.d.ts 的文件中,并将该声明的使用放在 app.ts 中。

    【讨论】:

    • 我不知道该告诉你什么,我编译了多个文件,当*.js文件生成时*.d.ts文件记录了上面显示的错误,以及一些其他的错误相同。在模块中找到了其他无法找到的东西。为了让问题保持简单,我唯一省略的事情是我还引用了其他生成的 *.d.ts 文件(这些文件没有错误并且看起来很好)。因此,例如Systems 模块引用了Shared 模块,但共享的模块编译得很好,没有问题。有 0 个真正的错误,就像其中 10 个找不到错误一样。
    • 您使用的是 TypeScript 0.9.0.1 还是更早的版本?
    • 我使用的是最新版本 0.9.0.1,稍后我将尝试通过 typescript playground 运行我的文件(就像在我的家用机器上一样)。看看这是否标志着任何事情。我发现另一件奇怪的事情是实际的类实现不包含命名空间的 Systems 部分,但声明将其放入,我认为这样做没有任何问题,但不确定这是否与它或一条红鲱鱼......将在问题中放入示例类实现,以防有帮助。
    • 我在 TypeScript 操场中添加了一个指向我的缩短示例的链接。
    • 我在 Typescript 操场上尝试了我的完整文件并遇到了同样的问题(在编写了编译器会提供的缺失依赖项的声明之后),已经给出了一个详细说明潜在问题的答案......即使错误并没有真正帮助我找到它......
    【解决方案2】:

    找出是什么原因造成的!

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

    我有一个这样的文件:

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

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

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

    module Systems.Services.GameSystems

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

    无论如何都可以解决它...疯狂...感谢您的帮助!

    【讨论】:

      【解决方案3】:

      由于您在多个步骤中进行编译,因此问题可能是.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。

      【讨论】:

      • 这就是我改变方法的原因,因为以前我有自包含模块,它们只是相互融合,所以这就是为什么我想只包含声明文件以便它知道类型存在,只是希望它们在运行时包含。同样在这种情况下,所有内容都具有类似格式的名称空间,因此即使不同文件中有 2 个 foo 类,它们也会位于不同的名称空间中。此外,我看到的具体问题是在同一个模块中引用一个对象,该模块也在同一个文件中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 2016-09-05
      • 2016-12-12
      • 2014-05-22
      • 2014-09-28
      • 2020-12-10
      • 2015-07-15
      相关资源
      最近更新 更多