5

Typescript完全严格地兼容js吗?

Typescript官方说它是Javascript的超集,好多人也是这么理解的。 本人验证过一些case,得出结论:并不是严格的超集。

例一:

contact.js

function contact() {
    this.name = "Jackie Ge"

    return {
        cname: this.name,
        getCname() {
            return this.cname
        }
    }
}

var c = new contact
console.log(c.cname, c.getCname())

如果是contact.ts, 那么tsc编译的时候出错:
error TS2350: Only a void function can be called with the 'new' keyword.

例二:

function Foo() {

}

Foo.array = [1, 2, 3]
Foo.min = function () {
    return Math.min(...this.array)
}

var obj = {
    array: [3, 6, 9]
}
console.log(Foo.min())
console.log(Foo.min.apply(obj))

tsc的时候报错:
error TS2339: Property 'array' does not exist on type '() => void'.
error TS2339: Property 'min' does not exist on type '() => void'

我想说的是,最好总是要做一些实地测试, 不要人云亦云。而且微软的东西做广告的成分较大,最好抱着怀疑的态度。微软技术从COM, VB, JScript, 到WPF, SilverLight,坑害了一代又一代的程序员,真是毁人不倦。目前Typescript又有这个架势。所以玩笑的说,程序员珍爱生命,远离微软。

Typescript优缺点分析

主观的分析TypeScript有其自身的优点:

  • 若类型的静态类型检查。 但这多半是给后端java/C#开发写前端降低门槛, 使之短时间内写出了所谓的前端代码。
  • ts是为了让新手也能写出不至于太寒碜的代码,便于团队的合作。

但缺点也明显:

  • 有些第三方的js库缺失dts,或者dts更新不及时。会导致不能便利的使用它或者调用了过时的方法/函数
  • 但如果已是熟练的前端开发, TypeScript有时候确实是桎梏。它强制你写一堆繁琐的接口类型。而且有些js的方式它还不兼容 (看我的上面的例子)
  • 它其实阉割了js的一些技法,(还是看我的例子)。要想修炼高手,须要远离ts。所谓可远观而不可近玩焉。

后记

后来仔细想了一番,我对TS的观点确实有那么点偏见,估计由于多年受MS毒害之后的反弹吧。所以在此更正一点认识:

如果只做静态类型检查, 推荐flow check, facebook出品。和TypeScript不同,它属于非侵入式编程。而且react和vue本身的源码都在用。我的理解是,ts开源,但非ES标准。也保不齐以后会加了很多私货而越来越远了ES标准。小公司小项目问题不大,但大公司大项目,fb,阿里巴巴等一般不会用ts,而是用标准ES或者自行开发框架。对于长期的大项目,公司的核心项目等,尽量向标准靠拢吧。

不能凡事都依赖智能提示吧,对于自己的项目代码,总得要有合理的规范,总得要记住里面的重点方法名,变量名吧。而且重要的方法名,变量名,命名好之后,推荐要长期保持,而非朝令夕改,而非总想着之后重构。


杰克船长
269 声望15 粉丝