【问题标题】:Inherited class from another module in Typescript从 Typescript 中的另一个模块继承的类
【发布时间】:2016-05-15 14:00:53
【问题描述】:

我正在尝试将一个抽象类扩展到另一个类,但为了更方便,我需要将这个抽象类放在另一个文件中。不幸的是,它引发了我难以理解的运行时错误。

这行得通:

abstract class Item{
   constructor(){
      console.log("I am an Item");
   }
}

export class Folder extends Item{
    constructor(){
         super();
    }
}

日志:

I am an Item

这不是:

module MyModule{
    export abstract class Item{
        constructor(){
            console.log("I am an Item");
        }
    }
}

export class Folder extends MyModule.Item{
    constructor(){
        super();
    }
}

编译但抛出:

Uncaught TypeError: Cannot read property 'prototype' of undefined

有人知道发生了什么吗?

【问题讨论】:

  • 问题似乎来自于导出抽象类。我刚刚找到的一个解决方案是声明一个指向这个抽象类的 var:export var ItemClass = Item;然后:导出类文件夹扩展 MyModule.ItemClass;它看起来像一个有效的解决方法吗?

标签: class module typescript extends


【解决方案1】:

源文件中的顶级导出(在本例中为 export class Folder)意味着 TypeScript 会将文件视为外部模块,但除非您在编译时指定模块格式,否则 TypeScript 应该发出 error TS1148: Cannot compile modules unless the '--module' flag is provided. 所以,如果你只使用内部模块,我有点困惑你是如何编译这些代码 sn-ps 的。

我强烈建议使用外部模块(其中每个 .ts 文件本身就是一个模块)并完全避免命名空间(以前称为内部模块)。

这是您的代码除了外部模块之外的样子:

// mymodule.ts
export abstract class Item {
  constructor() {
    console.log("I am an Item");
  }
}

// folder.ts
import * as MyModule from './mymodule';

export class Folder extends MyModule.Item {
  constructor() {
    super();
}

但是,如果您想坚持使用命名空间,您可以这样做:

namespace MyModule {
  export abstract class Item {
    constructor() {
      console.log("I am an Item");
    }
  }
}

namespace MyOtherModule {
  export class Folder extends MyModule.Item {
    constructor() {
      super();
    }
  }
}

【讨论】:

  • 非常感谢您的回答。它确实有效,但这是一个合理的选择吗?我的 ts 项目包含许多用内部模块组织的文件。将所有内容作为外部模块导入似乎是一项疯狂的工作。并且根据typescript.codeplex.com/…,“在两种情况下使用外部模块:node.js 和 require.js。不使用 node.js 或 require.js 的应用程序不需要使用外部模块,最好使用内部模块进行组织上面概述的概念。”。你怎么看?
  • @Kromah 这个特别的建议已经过时了,我相信这些天的共识是使用带有模块捆绑器的外部模块(如果你想将所有东西捆绑到一个或多个文件中)。但是,我也扩展了我的答案以涵盖命名空间方法。仅供参考,TypeScript 前段时间从 CodePlex 转移到了 Github,现在可以在 handbook 中找到文档的特定部分,这也有些过时了,Wiki 上有几页概述了每个 TypeScript 的主要变化释放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
相关资源
最近更新 更多