55

我在两个单独的文件中有两个类,一个从另一个扩展。基类包含一些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);
        }
   }
}

接着

// 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'
4

1 回答 1

48

带有命名空间的解决方案(不推荐)

要解决您的问题,您可以导出命名空间:

// 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而不是/// <reference

注意:语法/// <reference文件tsconfig.json替换。Node.js 的一个例子:

// tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es6"
  },
  "exclude": [
    "node_modules"
  ]
}
于 2016-06-01T14:54:13.900 回答