从Typescript中的另一个模块的继承类

从Typescript中的另一个模块的继承类

问题描述:

我想将一个抽象类扩展到另一个类,但为了更方便,我需要在另一个文件中有这个抽象类。不幸的是,它引发了我难以理解的运行时错误。从Typescript中的另一个模块的继承类

这工作:

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 

有谁知道发生了什么事?

+0

问题似乎来自出口抽象类。我刚发现的一个解决方案是声明一个var,它将指向这个抽象类: export var ItemClass = Item; then: export class Folder extends MyModule.ItemClass; 它看起来像一个有效的解决方法吗? – Kromah

源文件中的*导出(在这种情况下为export class Folder)意味着TypeScript将该文件视为外部模块,但除非您在编译TypeScript时应指定模块格式应发出error TS1148: Cannot compile modules unless the '--module' flag is provided.因此,我如果你只使用内部模块,你会如何设法编译这些代码片段。

我强烈建议使用外部模块(其中每个.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(); 
    } 
    } 
} 
+0

非常感谢您的回答。它确实有效,但这是一个合理的选择吗?我的ts项目包含许多用内部模块组织的文件。将所有内容作为外部模块导入,似乎是一件疯狂的工作。根据http://typescript.codeplex.com/wikipage?title=Modules%20in%20TypeScript&referringTitle=TypeScript%20Documentation,“在两种情况下使用外部模块:node.js和require.js。不使用node.js的应用程序或者require.js不需要使用外部模块,并且最好使用上述内部模块概念进行组织。“ 你觉得呢? – Kromah

+0

@Kromah这个特别的建议是过时的,我相信现在的共识是使用外部模块和模块打包器(如果你想把所有东西都捆绑到一个或多个文件中)。不过,我已经扩展了我的答案以涵盖名称空间方法。 FYI TypeScript从CodePlex转移到Github前一段时间,该文档的特定部分现在可以在[handbook](http://www.typescriptlang.org/Handbook)中找到,它也有点过时,有一个Wiki中的几个页面概述了每个TypeScript版本的主要变化。 –