我写了以下文件:
main.ts:
///<reference path="./external.ts"/>
hello();
external.ts
var hello = function() {
console.log("hello");
}
我将这两个文件编译为javascript并通过命令运行它们: $ node main.js
我希望调用函数'hello'。但是,不,我收到了一个错误:
ReferenceError:未定义hello
关于三重斜杠指令(https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html)的教程说:
编译器对要解析的输入文件执行预处理传递 所有三斜杠参考指令。在此过程中,额外的 文件被添加到编辑中。
所以我不明白为什么无法读取external.ts文件中的函数。
答案 0 :(得分:3)
该aproach仅适用于浏览器。使用节点时,您需要导入(require)文件才能使用它。
您需要这样做:
// external.ts
export var hello = function() {
console.log("hello");
}
并像这样使用它:
// main.ts
import { hello } from "./external";
hello();
此外,在编译时,您需要为节点编译它:
tsc -m commonjs ./main.ts
答案 1 :(得分:0)
说实话,整个问题没有任何意义。 参考文件的目的是告诉函数或类型是什么 以下程序中可用的接口。
应该更多地是关于声明而不是实现。
一个简单的例子是:
如果在main.ts
中,您得到了:
console.log('hi')
没有@ types / node,编译将失败,因为编译器不知道它是什么控制台。 这就是我们包含供编译器使用的参考文件的原因:
哦,有一个用log方法定义的控制台对象。
在您的示例中,您可以在hello.d.ts中进行声明:
declare function hello(): void;
然后在hello.ts中做
/// <reference path="./hello.d.ts" />
hello();
现在您将看到编译成功:
tsc hello.ts
这意味着编译器很高兴, 它知道hello是一个函数,可以这样调用。
但是,如果您使用
node hello.js
ReferenceError: hello is not defined
您将收到ReferenceError,因为在运行时节点引擎未实现hello()函数。 尝试使用
console.log('hello')
由引擎实现的有助于理解。