8

有很多关于这个主题的 StackOverflow 问题,但要么与我正在尝试的不完全相同,要么与以前版本的 TypeScript 不同。

我正在处理一个相当大的 TypeScript 项目,并且有一个给定的模块被分成多个文件,而不是每个类一个。

在 0.8.0 中,这很好用:

//* driver.ts *//
/// <reference path="express.d.ts"/>
/// <reference path="a.ts"/>
/// <reference path="b.ts"/>

.

//* a.ts *//
/// <reference path="driver.ts"/>
module m {
  import express = module("express");

  export class a {
    A: m.b;
    A2: express.ServerResponse;
  }
}

.

//* b.ts *//
/// <reference path="driver.ts"/>
module m {
  export class b {
      B: number;
  }
}

在 0.8.1 中,我不得不使用导出导入技巧更改a.ts

//* a.ts *//
/// <reference path="driver.ts"/>
module m {
  export import express = module("express");

  export class a {
    A: m.b;
    A2: express.ServerResponse;
  }
}

然而,在 0.8.2 中,导入不能再在模块声明中,因此a.ts已更改为:

//* a.ts *//
/// <reference path="driver.ts"/>
import express = module("express");
module m {

  export class a {
    A: m.b;
    A2: express.ServerResponse;
  }
}

现在会出现错误,因为a.ts在b.ts 中看不到模块的扩展名。

我的理解:

  • 由于 import 语句, a.ts已成为外部模块。
  • 删除a.ts中的导入允许 a 和 b 以及我的模块很好地合并在一起。
  • 将导入更改为 require 语句会丢失express.d.ts中的类型定义

我不明白的是:

  • 如果不将所有模块文件合并在一起,我真的没有办法解决这个问题吗?

如果在其他地方回答了这个问题,我深表歉意 - 只需将我链接到那里 - 但其他类似问题似乎都没有明确回答这个问题。

4

1 回答 1

5

这就是我对你的情况的看法。

你的模块...

你需要在你的模块之后命名你的文件,所以a.ts,实际上应该是m.ts并且应该包含类似......

import express = module('express');

export class a {
    A: b;
    A2: express.ServerResponse;
}

export class b {
    B: number;
}

你不应该reference在这里使用语句。

当您在 nodejs 上运行代码时,您不能真正将代码拆分为多个文件,因为文件本身就是您的模块 - 当您import m = module('m');查找m.js. 您可以做的是以文件夹结构组织文件。

import x = module('m/x'); // m/x.js
import y = module('m/y'); // m/y.js
于 2013-02-12T17:03:18.060 回答