OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

为什么TypeScript解决不了问题


分享到


分类 心得体会   发布 andrewleeson  1396535265211
注意 转载须保留原文链接,译文链接,作者译者等信息。  

我以前写过关于JavaScript编程陷阱和一些可能解决此难题的方法的文章。一个可能的解决方法是TypeScript。这是一个由微软开发的开源项目语言,它是JavaScript的一个类型化超集,最终能编译生成JavaScript。它是在JavaScript的基础上增加类、模块、接口和可选的类型声明而实现的。编译时,类型声明将被擦除,生成ECMAScript 3 兼容的代码。如果可能的话,TypeScript试图将让语法和语义匹配的建议提交给ECMAScript 6。建议的很多地方还在变化不定,而且最终的规则是什么还尚不清楚,所以我们必须要看到TypeScript是如何有能力处理它的。

修复问题

TypeScript用类型、类和接口来增强JavaScript。一些人认为那些正是JavaScript的问题所在。其实不然。JavaScript的问题并不是因为它是一个无类的基于面向对象的动态类型原型语言。其实这才是JavaScript的实力所在。JavaScript的问题在于它是一个设计不当的语言,充满了许多隐藏的陷阱等着那些没有防备的开发人员来踩。

 

我认为JavaScript的弱类型是其最大的亮点,但类型检查却名过其实了。TypeScript增加了一些东西,但却付出了代价。这不是我愿意付出的代价。
 
——JavaScript: The Good Parts 的作者 Douglas Crockford

谁来维护类型定义

TypeScript增加了可选的类型声明,但当与已经存在的JavaScript库相互作用时,就没有类声明了,而且TypeScript的很多优势将不复存在。为了处理这个问题,TypeScript支持类型定义文件。这些文件给已存在的JavaScript库提供丢失的类型声明。给你想使用的JavaScript库提供好的类型定义文件是你很好的使用TypeScript的重要内容。微软指出明确类型化的工程作为类型定义的根源供流行的JavaScript库使用。然而,如果你想使用的库不够流行或太新了,那么会怎样呢?或者,虽然有类型定义,但与你需要使用的库版本不符,会怎样?你有真正关注过许多这些JavaScript库发布新版本有多频繁吗?你怎么敢肯定类型定义是正确的?它们只是潜在发展问题的更多来源而已。如果不是库作者来维护这些库,任何这些库的附件绑定成为额外让人头疼的根源。最近,当有些新的Ember.js库的NuGet包过期,且支持jQuery的包无法正确地并排支持1倍,2倍代码行的安置时,我在社区维护包(不是TypeScript或明确类型化的)上遇到了类似的问题。

还是用JavaScript

TypeScript的真正问题包含在一句话中——“它是JavaScript的超集”。这意味着所有合法的JavaScript程序同时也是合法的TypeScript程序。TypeScript没有修复任何已在 ECMA Script 5中修复之外的问题。所以,比如说,非严格的等号==还仍然存在,且起严格的等号===更精简更自然。仍然存在分号插入的陌生感。在有些情况下,这些附加的特性实际上使开发人员更有可能将丢弃语义上错误的心理模型,然后径直走到陷阱中去。类让这个不变的this关键词变得更加混乱。例如,来自TypeScript的Greeter类的this的用法让在感到迷惑:

class Greeter {
	greeting: string;
	constructor(message: string) {
		this.greeting = message;
	}
	greet() {
		return "Hello, " + this.greeting;
	}
}

我们不禁觉得Greeter类方法里this关键词应该始终引用一个Greeter的实例。然而,JavaScript中this的语义没有改变:

var greeter = new Greeter("world");
var unbound = greeter.greet;
alert(unbound());

上面的代码将打印出“Hello,undefined”而不是想当然的“Hello,World”。

更新

一个评论(alleycat5Reddit上的评论)指出TypeScript只片面的处理==问题,因为当如果已有类型信息时用==进行比较会产生类型错误。                                          
var a = "ssdf";
var b = 5;
alert(a==b); // "Operator '==' cannot be applied to types 'string' and 'number'."

 然而,如果任意一个变量有Objectany类型,将不会产生类型错误且会继续计算这宽松比较的结果。

TypeScript并不是解决方案

我认为TypeScript并不是这个问题的解决方案。或者更精确的来说,它可能是其它问题的解决方案。如果你不顾一切地喜欢JavaScript。但如果你想让它有类、模块、接口和静态类型化,那么TypeScript就是一个解决方案。我推断,随着时间的推移,人们会逐步的认识到TypeScript并没有消除JavaScript中存在的陷阱,通过提供让人错觉的安全只会让其变得更迷惑。TypeScript只会成为另一个被小部分开发人员使用的web开发边缘的工具。

本文是4篇连载文章的第2篇:

  • 第二篇  本文

原文地址: 点此
社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. NODE.JS为什么会成为企业中的首选技术
  2. 为什么你写的Python运行的那么慢呢?
  3. 快乐Node程序员的10个习惯
  4. 用纯CSS实现的箭头
  5. 我为什么不从NodeJS切换到Go
  6. 什么是最好的编程语言?(怎样才能爱上编程呢?)
  7. 该不该闭合这些元素?曾经〈br/〉的写法是错误的
  8. 在JavaScript里写类层次结构?别那么做!
  9. HTML和CSS是什么玩意儿?
  10. 为什么优秀的管理者如此罕见
  11. 用 OnceAir 搭建个人Git/Svn/照片备份服务器,每年电费7块钱

 相关阅读 - 心得体会
  1. 每周工作不要超过40小时
  2. 10位顶级PHP大师的开发原则
  3. 软件开发中最流行的错误观点有哪些?
  4. 14条建议,使你的IT职业生涯更上一层楼
  5. 不能和老板做亲密朋友
  6. 老码农教你学英语
  7. 不要盲目的在项目中使用LESS CSS
  8. 做为技术人员为什么要写博客
  9. 幸福和成功的十条诫律
  10. 在创业型软件公司的收获

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号