2

我已经习惯在 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 写的。在我完美的小世界中,我希望能够利用智能感知来查看utils这种情况下的属性(所以当我输入 时utils,我认为utils.doSomething这是一个选项)。

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

4

3 回答 3

4

TypeScript 默认使用 CommonJS 样式的模块导出(即为exports变量分配成员)。这是在带有 Intellisense 对 Visual Studio 支持的 TypeScript 中执行此操作的方法:

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

但是,如果你想 100% 使用 JavaScript,你需要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());
});
于 2013-08-04T05:21:52.357 回答
1

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

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

module utils {
    doSomething():string;
}

这将使您能够将其添加到原始文件中:

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

现在你应该得到智能感知。

然而这感觉很不对,因为你为什么要为自己编写的javascript 代码编写定义文件,这几乎就像编写两次代码一样。如果您可以硬着头皮继续使用打字稿,那么您应该这样做。对冲你的赌注,让你做更多的工作(当然,如果我们谈论的是现有代码,那么定义/声明文件可能是值得的,因为你不必移植现有代码。

于 2013-08-02T18:11:35.430 回答
0

您可以定义接口 inline :

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());
});
于 2013-08-03T06:20:15.377 回答