告诉TypeScript该文件将包含在脚本标记中?

时间:2018-02-18 00:36:55

标签: javascript html typescript scope frontend

我正在使用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.tssocket.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还编译一些后端节点代码以及前端代码)

1 个答案:

答案 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}}并导出函数而不是])。