将 typescript 定义文件与 nodejs 混合需要内部模块中的多个文件

Posted

技术标签:

【中文标题】将 typescript 定义文件与 nodejs 混合需要内部模块中的多个文件【英文标题】:Mixing typescript definition files with nodejs require over multiple files in an internal module 【发布时间】:2013-12-10 11:40:46 【问题描述】:

将 nodejs 模块 (require) 与 typescript 定义文件 (d.ts) 在模块内的文件中多次混合是否存在任何已知问题?

我的情况是每个文件夹都有一个模块命名空间(就像我在 C# 中那样),然后我基本上通过 tsc 将它们全部编译到输出的my-module.js。然而,我不断收到像Could not find type htmlElement 这样的奇怪错误,但很多人指出,tsc 默认包含 typescript lib 文件,其中包含所有这些类型。

我注意到一些人在将相同的 d.ts 文件包含在多个文件中时出现 odd 错误,这些文件都使用 --out 标志编译以将它们全部放入一个文件中,那么这会导致我的问题吗?

我的用法是:

///<reference path="path/to/knockout.d.ts" />
import ko = require("knockout");

然后将其放入需要淘汰 js 的每个文件中,这至少是我当前正在尝试编译的模块中的 10 个文件。它只是不断地说 knockout.d.ts 找不到 HTMLElemet、Element、Document 等类型。

【问题讨论】:

我没有遇到这个问题 - 但也许我低于显示问题所需的文件数量的阈值。我重复了几次参考资料 - 但可能没有你那么多。 Ryan Cavanaugh 可能最适合回答这个问题。 这可能是一个红鲱鱼,但没有记录要编译的文件的错误它只是 knockout.d.ts 上的错误但是我不确定如何最好地解决这个问题...... 【参考方案1】:

如果您正在使用外部模块(如果您有***“导入” - 如上所示),那么您不能使用 --out 开关来组合多个源文件。对于外部模块,一个源文件 = 一个模块是一个限制。对于不在外部模块中的源(即贡献于“全局”范围),您可以使用 --out 将输入源组合到一个输出 javascript 文件。

我不知道“找不到 HTMLElement”的问题。如果你能提供一个重现(并概述你正在使用的版本)我可以看看。

【讨论】:

import ko = require("knockout"); 是我试图通过 npm 要求非 typescript 模块。 (npm install knockout)。我在参考文献中包含了上面 ko 的定义文件。这是一个更复杂的用例,但我相信它应该是合法的。上面的导入等可能没有任何问题,但编译器只是抱怨它在 knockout.d.ts 中找不到我无法相信的类型。

以上是关于将 typescript 定义文件与 nodejs 混合需要内部模块中的多个文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将 webassembly 包含在 typescript 中(没有 nodejs)

TypeScript的使用

Nodejs/Express/Typescript 需要 module.exports

将 Typescript 编译为 NodeJs:es6 类型问题

将最新版本的 TypeScript 定义与较旧的 JavaScript 库一起使用

如何将 Typescript、NodeJS 和 Express 应用程序部署到 Heroku