【问题标题】:Typescript; Conflicting information about "modules"打字稿;关于“模块”的冲突信息
【发布时间】:2014-01-27 20:43:33
【问题描述】:

我正在尝试在我的网站的打字稿中设置一些“模块”,但我得到了相互矛盾的信息和相互矛盾的结果。例如,我有三个“类”。 PrototypeItemTag。他们三个都需要有一组特定的属性,所以我决定将其作为基类ComponentModel,如下所示。

module website.admin.components {
    export class ComponentModel {
    
       public Components = { // define property };
    }
}

现在,我想在我的其他三个中继承这个类,所以我从'tags'开始。

module website.admin.viewModels {
   export class Tag extends website.admin.components.ComponentModel {
   
      // tag specific properties
      constructor() { super(); } // initialize the base class as required
   }
}

好的,这似乎可行。但是Prototype 类上完全相同的代码不起作用;

module website.admin.viewModels {
    export class Prototype extends website.admin.components.ComponentModel {
    
        // prototype specific properties
        constructor() { super(); }
    }
}

这只会导致各种奇怪的行为,并且在运行时拒绝工作。我收到以下错误;

未捕获的类型错误:无法读取未定义的属性“组件模型”

未捕获的类型错误:无法读取未定义的属性“原型”

Uncaught TypeError: undefined is not a function

谁能帮我弄清楚为什么会这样?我能做些什么来阻止它?越来越烦人了。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    可能是您的脚本以错误的顺序加载。如果检查捆绑的文件,依赖项是否在使用之前出现?通常它们不会,除非您采取措施确保它们排列整齐。

    您如何正确订购它们?

    如果你使用 ASP.NET MVC 捆绑,你可以manually order the bundle

    或者,如果您将 ///<reference path="...ts" /> 引用 cmets 添加到文件并使用 TypeScript 编译器上的 --out 标志编译为单个文件,只要不存在循环依赖关系,它将 sort out the order based on the reference comments

    如果你想这样做,你仍然可以根据 TypeScript 为你创建的组合输出进行打包和缩小。

    【讨论】:

    • 我当时(显然是错误的)假设 typescript 使用 AMD 模块格式来自动确保以正确的顺序加载内容。
    • 如果你想使用 AMD,你需要切换到外部模块 - 你正在使用内部模块。然后使用 import 语句,而不是引用注释。
    • 老实说,我从来没有遇到过import 语句正常工作的情况。它总是告诉我cannot declare a module to a non-module type。我已经挖掘了无数关于这个主题的“教程”,但没有任何帮助。
    • 我发现的一切都假设你的类都是“根级别”,没有任何命名空间嵌套。
    • 为了组织起见,我将我的东西组织成命名空间,其中许多是嵌套和分类的。 “模块”似乎不支持这个概念。
    【解决方案2】:

    从错误的外观来看,Prototype 类似乎位于不同的文件中,并且没有对包含 ComponentModel 类的文件的引用。

    【讨论】:

    • 但是Tags文件是一样的,而且工作正常。为什么 Tags.ts 文件有效,而 Prototype 文件无效?
    • 所以tags.ts和prototype.ts都没有引用“componentmodel.ts”?
    • 正确。但它适用于 Tags.ts 文件,即使它们都没有引用它。
    • 我假设您在编译期间没有任何错误,并且这是在编译的 JavaScript 中发生的运行时间?这是在网络应用程序中使用的吗?您可能在页面或包中缺少对 componentmodel.js 的引用?尝试在使用 tags.js 的页面上查看源代码,并与使用prototype.js 的页面进行比较
    • 是的,这仅在运行时发生,是的,它是一个网络应用程序。没有真正的方法可能会丢失参考,它使用 ASP.NET 捆绑系统将所有文件捆绑在一起,并且清楚地显示在那里。
    猜你喜欢
    • 1970-01-01
    • 2020-06-08
    • 2013-03-26
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多