如何在TypeScript中使用名称空间和导入
我在两个独立的文件中有两个类,一个是从另一个扩展而来的。基类包含一些使用节点模块的如何在TypeScript中使用名称空间和导入,typescript,namespaces,es6-modules,Typescript,Namespaces,Es6 Modules,我在两个独立的文件中有两个类,一个是从另一个扩展而来的。基类包含一些使用节点模块的import语句。我不清楚为什么派生类(在一个单独的文件中)不能识别基类 有人能澄清一下吗 // UtilBase.ts /// <reference path="../typings/node.d.ts" /> /// <reference path="../typings/packages.d.ts" /> import * as path from "path"; // <-
import
语句。我不清楚为什么派生类(在一个单独的文件中)不能识别基类
有人能澄清一下吗
// UtilBase.ts
/// <reference path="../typings/node.d.ts" />
/// <reference path="../typings/packages.d.ts" />
import * as path from "path"; // <---- THIS LINE BREAKS THE BUILD!!!!
namespace My.utils {
export class UtilBase {
protected fixPath(value: string): string {
return value.replace('/', path.sep);
}
}
}
具有名称空间的解决方案(不推荐)
要解决问题,可以导出命名空间:
// UtilBase.ts
import * as path from "path";
export namespace My.utils {
export class UtilBase {
protected fixPath(value: string): string {
return value.replace('/', path.sep);
}
}
}
然后,您应该能够导入它:
// UtilOne.ts
import {My} from './UtilBase';
namespace My.utils {
export class UtilOne extends My.utils.UtilBase {
}
}
但是,如果目的是组织代码,那么同时使用名称空间和(ES6)模块是不好的做法。对于Node.js,您的文件是模块,那么您应该避免使用名称空间
使用不带名称空间的ES6模块
TypeScript非常支持ES6模块的语法:
// UtilBase.ts
import * as path from "path";
export default class UtilBase {
protected fixPath(value: string): string {
return value.replace('/', path.sep);
}
}
// UtilOne.ts
import UtilBase from './UtilBase';
export default class UtilOne extends UtilBase {
}
这是推荐的方法。ES6模块通过重命名每个导入的资源来防止命名冲突
它将在Node.js上工作(使用编译器选项中的commonjs
模块语法)
有关ES6模块语法的详细介绍
使用文件
tsconfig.json
而不是///另请参见:我不确定帖子中的答案可能在哪里,但感谢您的回复。谢谢。在阅读了十几篇关于如何使用名称空间和模块的帖子和答案后,最后是一篇让事情变得清晰的帖子。你如何证明同时使用名称空间和(ES6)模块是一种不好的做法“为了重申为什么不应该尝试为模块内容命名,命名空间的一般思想是提供构造的逻辑分组,并防止名称冲突。由于模块文件本身已经是一个逻辑分组,并且其顶级名称由导入它的代码定义,因此无需为导出的对象使用额外的模块层。“在web应用程序中,您通常希望将所有内容捆绑在少量脚本中。。。因此名称空间在那里是有意义的。@Paleon那么typescript中的整个名称空间解决方案有点混乱。名称空间和模块边框应相同。它应该有助于消除混乱的导入/导出故事,而不是增加一些额外的复杂性。
// UtilOne.ts
import {My} from './UtilBase';
namespace My.utils {
export class UtilOne extends My.utils.UtilBase {
}
}
// UtilBase.ts
import * as path from "path";
export default class UtilBase {
protected fixPath(value: string): string {
return value.replace('/', path.sep);
}
}
// UtilOne.ts
import UtilBase from './UtilBase';
export default class UtilOne extends UtilBase {
}
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
},
"exclude": [
"node_modules"
]
}