如何在 TypeScript 中通过导入使用命名空间
How to use namespaces with import in TypeScript
我在两个单独的文件中有两个 classes,一个从另一个扩展。基础 class 包含一些使用节点模块的 import
语句。我不清楚为什么派生的 class(在单独的文件中)无法识别基数 class!!!???
有人可以澄清一下吗?
// 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);
}
}
}
然后
// UtilOne.ts
/// <reference path="UtilBase.ts" />
namespace My.utils {
export class UtilOne extends My.utils.UtilBase {
}
}
编译后得到:
src/UtilOne.ts(6,47): error TS2339: Property 'UtilBase' does not
exist on type 'typeof utils'
带有命名空间的解决方案(不推荐)
要解决您的问题,您可以导出您的命名空间:
// 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 {
}
}
但是,如果目的是组织代码,那么使用 namespaces 和 (ES6) modules 是一个不好的做法同一时间。使用 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 模块语法,read this article。
使用文件 tsconfig.json
而不是 /// <reference
注意:语法/// <reference
被the file tsconfig.json
代替。 Node.js 的示例:
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
},
"exclude": [
"node_modules"
]
}
我在两个单独的文件中有两个 classes,一个从另一个扩展。基础 class 包含一些使用节点模块的 import
语句。我不清楚为什么派生的 class(在单独的文件中)无法识别基数 class!!!???
有人可以澄清一下吗?
// 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);
}
}
}
然后
// UtilOne.ts
/// <reference path="UtilBase.ts" />
namespace My.utils {
export class UtilOne extends My.utils.UtilBase {
}
}
编译后得到:
src/UtilOne.ts(6,47): error TS2339: Property 'UtilBase' does not
exist on type 'typeof utils'
带有命名空间的解决方案(不推荐)
要解决您的问题,您可以导出您的命名空间:
// 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 {
}
}
但是,如果目的是组织代码,那么使用 namespaces 和 (ES6) modules 是一个不好的做法同一时间。使用 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 模块语法,read this article。
使用文件 tsconfig.json
而不是 /// <reference
注意:语法/// <reference
被the file tsconfig.json
代替。 Node.js 的示例:
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
},
"exclude": [
"node_modules"
]
}