是否有工具将JavaScript文件转换为TypeScript

Gis*_*way 124 javascript typescript

现在TypeScript问世了,对我来说这是一个令人兴奋的消息,但是如何将所有现有的JavaScript文件转换为TypeScript.

lhk*_*lhk 100

我担心这会很成问题.TypeScript是JavaScript的超集.这意味着所有有效的JavaScript代码也是有效的TypeScript代码.这是错的.以下代码在JavaScript中是正确的,但在TypeScript中创建错误:

var data={x:5, y:6};
data.z=5;
Run Code Online (Sandbox Code Playgroud)

您可以通过将数据声明为"环境"来获取JavaScript的动态行为

var data:any={x:5, y:6};
data.z=5;
Run Code Online (Sandbox Code Playgroud)

现在这也适用于TypeScript.不过,您可以将.js文件的扩展名更改为.ts,并将此文件传递给TypeScript编译器.这让我很困惑,我在freenode上的TypeScript IRC频道中提出了这个问题.事实证明,Typescript编译器检查其输入是否有效,并且在发现某些内容时不会做任何事情.直观地说这听起来不错.您应该能够通过更新文件扩展名将所有JavaScript"转换"为Typescript并且很好.不幸的是,这不能按预期工作.我们假设你有这个代码:

var func=function(n){alert(n)};

var data={x:5};
data.z=6;
Run Code Online (Sandbox Code Playgroud)

编辑:我刚刚尝试编译它,它不起作用.对不起,我好像错了:TypeScript编译器甚至不接受纯JavaScript.我会试着找出问题所在.

您已将文件扩展名更改为.ts,并在其他代码中使用函数func.起初一切似乎都很好,但随后出现了一个丑陋的虫子.您决定某些静态类型检查可能会对您有所帮助,您将代码更改为:

var func=function(n:string){alert(n)};

var data={x:5};
data.z=6;
Run Code Online (Sandbox Code Playgroud)

但现在这不再是有效的JavaScript代码,会导致编译器生成大量错误消息.在所有数据都没有成员"z"之后....如果默认类型总是"任何",则可以避免此行为,但类型推断将完全无用.

那你怎么解决这个问题呢? 答案是:声明文件.您可以在项目中"按原样"使用JavaScript代码,并在几个.d.ts文件的帮助下仍然可以进行静态类型检查.它们通知编译器在JavaScript文件中声明了哪些变量,方法和"类",包括它们的类型.因此,它们允许编译时类型检查和梦幻般的智能感知.我的例子的.d.ts文件就是

declare var data:any;
declare function func(n:string);
Run Code Online (Sandbox Code Playgroud)

将其保存为"myjsfile.d.ts"并将其导入到typescript中

///<reference path="myjsfile.d.ts"/>
Run Code Online (Sandbox Code Playgroud)

一定要在编译的打字稿上面的html文件中包含JavaScript脚本.这是一个有趣的链接.您可能对"将JavaScript转换为TypeScript"部分感兴趣.

  • +1表示并非所有有效的JS都是有效的TS. (51认同)
  • 实际上,您发布的所有javascript片段都是有效的打字稿.你只需要关闭一些编译器开关,如--noImplictAny等.但是,最好将它们最终打开,并在需要的地方添加类型注释 (13认同)
  • 尽管TypeScript出现了“错误”,但TypeScript仍允许将其编译为JavaScript(在当前的TypeScript演示版中,此答案中的所有JavaScript示例都没有编译问题),它确实可以作为超集使用-至少包括以下JavaScript功能: TypeScript编译器能够处理... (2认同)

Shk*_* S. 49

更新:本文详细介绍了工具

从版本9开始的ReSharper(可用的EAP版本)具有自动将JavaScript代码转换为TypeScript的功能.您可以将.js文件重命名为.ts,然后查看R#建议,如下所示:

没有尝试过现实世界的例子.但它能够转换大量的JavaScript模式.