我已经习惯在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语法,但我想我还是会检查一下!
答案 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());
});