将RequireJS与TypeScript一起使用并保留Intellisense

时间:2013-08-02 15:58:12

标签: typescript

我已经习惯在Visual Studio中使用TypeScript,但只是编写纯JavaScript(我意识到TypeScript自定义语法的强大功能,但更喜欢对冲我的赌注并保持我的JS熟练程度!)。我的问题与在这种环境中使用RequireJS有关。例如:

require(["jquery", "app/utils.js"], function ($, utils) {
    console.log(utils.doSomething());
});

...我的utils.js看起来像这样:

define([], function () {
    var doSomething = function () {
        return "ok";
    };
    return {
        doSomething: doSomething
    };
});

这是我在TypeScript中编写的内容。在我完美的小世界中,我希望能够利用intellisense在这种情况下查看utils的属性(所以当我输入utils时,我看到utils.doSomething为选项)。

我猜答案是“不能这样做”而我必须使用导入/导出TS语法,但我想我还是会检查一下!

3 个答案:

答案 0 :(得分:4)

TypeScript默认为CommonJS样式的模块导出(即将成员分配给exports变量)。这是在TypeScript中使用Intellisense支持Visual Studio的方法:

define([], function () {
    var doSomething = function () {
        return "ok";
    };
    var r = {
        doSomething: doSomething
    };
    export = r;
});

但是,如果您希望在JavaScript中保持100%,则需要为模块编写类型定义文件app.d.ts以提供类型信息:

declare module "app/utils"
{
        function doSomething(): string;
}

在你的应用中:

///<reference path="app.d.ts" />

require(["jquery", "app/utils"], function ($, utils) {
    console.log(utils.doSomething());
});

答案 1 :(得分:1)

如果 utils.js 确实是一个javascript文件,那么TypeScript将不会免费为您提供智能感知。您需要为javascript文件编写声明:

因此,您可以创建一个 utils.d.ts 文件,如下所示:

module utils {
    doSomething():string;
}

这样您就可以将其添加到原始文件中:

///<reference src="app/utils.d.ts" />

现在你应该得到intellisense。

然而,这感觉非常错误,为什么要为自己编写的 javascript代码编写定义文件,这几乎就像编写代码两次一样。 如果你可以咬紧牙关并使用打字稿,那么你应该这样做。对冲你的赌注给你更多的工作(当然,如果我们谈论现有的代码,那么定义/声明文件可能是值得的,因为你不必移植现有的代码。

答案 2 :(得分:0)

您可以内联定义界面:

require(["jquery", "app/utils.js"], function ($, utils : { doSomething:()=>string; } ) {
    console.log(utils.doSomething());
});

或在外面

interface IUtils {
    doSomething:()=>string; 
}
require(["jquery", "app/utils.js"], function ($, utils : IUtils ) {
    console.log(utils.doSomething());
});