打字稿足够健壮吗?

Is typescript robust enough?

现在每个人都在强制打字稿。有很多关于它的粉丝和文章。 Angular 团队正在 TS 中制作他们的框架。 但是我把 ES6 迁移到 TS 的经历非常令人失望。

上个月我尝试将我们相对较新的代码库(用 ES6 编写)迁移到 Typescript,但遇到了很多陷阱!

需要明确的是,我们正在谈论 node.js 具有 mocha 单元测试和配置 ESLint 的应用程序(使用 babel 进行转译)。

首先,为了支持类型检查,我设置了 noImplicitAny 选项, 得到了数百个错误并修复了它。但在那之后,由于打字稿不理解一些 node.js 预定义模块,比如 stream,我得到了打字错误(问题实际上更大,因为很多模块缺少打字)。

之后,我安装了 typings - 建议替换 tsd 工具来管理库 d.ts 文件,但它是 node 键入定义,同时解析 stream 问题,添加了很多错误,因为它重复了一些预定义的类型。

另外,我发现typescript实际上并没有将ES6的很多特性编译成ES5,比如生成器。 它迫使我进行复杂的构建过程(TS -> (typescript) ES6 -> (babel) ES5),这意味着我不得不浪费我原来的源映射。

以上配置花费了大量时间。

所以,我很困惑。我真的很喜欢打字稿背后的想法,但对我来说实施起来太粗鲁了。希望我是错的。

也许在实际项目中使用 Typescript 而不是 HelloWorld 的人可以解释我做错了什么?

I set up noImplicitAny option

您的期望很高。为了在从 ES6 迁移项目时获得更好的体验,请不要使用此选项。

I got typing errors due to typescript does not understand some node.js predefined modules, like stream.

没有类型定义的 JS 库很痛苦。但是隐式类型 any 会救你。

After that, I installed typings […] added a lot of errors because it duplicates some predefined types.

从您的 tsconfig.json.

中排除浏览器目录和 browser.d.ts

In addition, i found out that typescript does not compile many features of ES6 to ES5 actually, such as generators. It forces me to made complex build process (TS -> (typescript) ES6 -> (babel) ES5), and it means that I have to waste my original source maps.

设计选择使 TS 真正强大:编译后的代码不需要任何运行时库。

但是为什么在生成的 ES6 代码上使用 Babel?使用 Node.js 4 或 5,您的 ES6 代码可以正常工作。

Is typescript robust enough?

与 JavaScript VM 一样多。

带有目标 ES6 的 TypeScript Node.js

从 TS 1.7 开始,选项 --module 可以与目标 es6 结合使用。例如,在 tsconfig.json:

"compilerOptions": {
  "module": "commonjs",
  "target": "es6",
}

注意:自 TS 1.8 起,modules are emitted with a "use strict"; prologue