我正在使用TypeScript处理一些前端 JavaScript,我正在加载来自index.html
的两个脚本,如下所示:
<script src="replacements.js"></script>
<script src="socket.js"></script>
replacements.ts
(编译成replacements.js)定义了一个函数insertReplacement
,如下所示:
export = 0;
import IReplacement from "../src/IReplacement";
// insertReplacement is defined in the global scope
function insertReplacement(rep : IReplacement) : void {
// ...
}
需要export = 0
来取消tsc添加的Object.defineProperty(exports, "__esModule", { value: true });
行,因为当在浏览器中运行时,此行会导致错误。
socket.ts
使用此函数,因为socket.js
之后加载replacements.js
,应该在全局范围内可用(就像这些文件是相同的一样)。 socket.ts
看起来像这样:
export = 0;
import IReplacement from "../src/IReplacement";
var docs: IReplacement[];
// populate `docs` here
docs.forEach((doc) => insertReplacement(doc))
// tsc: ^ cannot find name 'insertReplacement'
IReplacement
是客户端(replacements.ts
和socket.ts
)上的两个文件以及服务器端的其他文件使用的类型。它看起来像这样:
export default interface IReplacement {
// ...
}
export {IReplacement};
不幸的是,当我尝试tsc
时,我收到错误&#34;找不到名称insertReplacement
&#34;在socket.ts
。 有没有办法告诉编译器这个函数在运行时是否可用?
(如果它有用,这里是tsconfig.json
的编译器选项):
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"noImplicitAny": false,
"removeComments": true,
"preserveConstEnums": true,
"sourceMap": false,
"moduleResolution": "node",
"outDir": "dist",
"allowJs": true
}
(此tsconfig.json
还编译一些后端节点代码以及前端代码)
答案 0 :(得分:3)
insertReplacement
不在全球范围内。您正在设置模块,它不会在全局范围内。
您的replacement.ts
脚本会输出:
define(["require", "exports"], function (require, exports) {
"use strict";
// insertReplacement is defined in the global scope
function insertReplacement(rep) {
// ...
}
return 0;
});
(source)
现在看看为什么?应该这么简单:
replacements.ts
// insertReplacement is defined in the global scope
function insertReplacement(rep : IReplacement) : void {
// ...
}
socket.ts
var docs: IReplacement[];
// populate `docs` here
docs.forEach((doc) => insertReplacement(doc))
// tsc: ^ cannot find name 'insertReplacement'
现在全都是全球范围的。 <{1}}脚本不需要导入其他文件来以这种方式拾取类型。
提示:我强烈建议使用socket.ts
块来使您的代码脱离全局范围,以尽可能少地污染它(或者学习如何正确使用模块[您必须先删除{ {1}}并导出函数而不是])。