Typescript /// <reference path =“...”>:为什么它对我不起作用?

时间:2017-06-19 19:39:15

标签: typescript

我写了以下文件:

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文件中的函数。

2 个答案:

答案 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') 
由引擎实现的

有助于理解。