如何在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"
  ]
}