从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
有谁知道发生了什么事?
源文件中的*导出(在这种情况下为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();
}
}
}
非常感谢您的回答。它确实有效,但这是一个合理的选择吗?我的ts项目包含许多用内部模块组织的文件。将所有内容作为外部模块导入,似乎是一件疯狂的工作。根据http://typescript.codeplex.com/wikipage?title=Modules%20in%20TypeScript&referringTitle=TypeScript%20Documentation,“在两种情况下使用外部模块:node.js和require.js。不使用node.js的应用程序或者require.js不需要使用外部模块,并且最好使用上述内部模块概念进行组织。“ 你觉得呢? – Kromah
@Kromah这个特别的建议是过时的,我相信现在的共识是使用外部模块和模块打包器(如果你想把所有东西都捆绑到一个或多个文件中)。不过,我已经扩展了我的答案以涵盖名称空间方法。 FYI TypeScript从CodePlex转移到Github前一段时间,该文档的特定部分现在可以在[handbook](http://www.typescriptlang.org/Handbook)中找到,它也有点过时,有一个Wiki中的几个页面概述了每个TypeScript版本的主要变化。 –
问题似乎来自出口抽象类。我刚发现的一个解决方案是声明一个var,它将指向这个抽象类: export var ItemClass = Item; then: export class Folder extends MyModule.ItemClass; 它看起来像一个有效的解决方法吗? – Kromah