V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hellowes
V2EX  ›  TypeScript

TypeScript 压根就不是 JavaScript 的超集,这是微软在忽悠程序员吗

  •  
  •   hellowes · 2019-02-11 14:54:12 +08:00 · 8577 次点击
    这是一个创建于 2118 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近 Vue3 要用 TypeScript 重写,一时之间我感到焦虑。虽然快学不动了,但是还是想把平时的 JavaScript 插件,Vue 页面之类的转移到 TypeScript 架构上。

    之前一直久仰大名,说 TS 是 JS 的超集,我差点就信了,事实证明,他们不是完全语言兼容的!不信看下面这段 JS 的代码:

     var saveRef = setTimeout(()=>{
     	var value = {
        	username: 'test123',
            password: 1234
        };
        $.ajax({
        	url: "/opread/get_auth",
            data: JSON.stringify(value), 
            ....
        })
     },3000)
    

    在 tsc 下,我尝试将这段代码在 ts 下运行,并且成功发出一个 ajax。

    结果 tsc 提示我 saveRef,value 都需要定义:any,甚至函数也要定义返回值。虽然我知道这是 ts 的特点,但是这完全不符合他说的超集。我的旧代码有 N 多这种无定义的情况,难道我都需要一个个去改?太费劲了,查很多配置都没提及,所以发帖想问一下各位 V 友如何解决升级的问题

    29 条回复    2019-02-12 16:42:10 +08:00
    azh7138m
        1
    azh7138m  
       2019-02-11 14:58:00 +08:00 via Android   ❤️ 5
    先上文档 https://www.typescriptlang.org/docs/handbook/tsconfig-json.html
    noImplicitAny 配置的啥?每个 strict 又配置的啥?你自己配置的去怪 tsc,
    tsc:我不是 我没有 你别瞎说啊
    wszgrcy
        2
    wszgrcy  
       2019-02-11 15:01:06 +08:00 via Android
    楼主在钓鱼
    chemzqm
        3
    chemzqm  
       2019-02-11 16:02:39 +08:00   ❤️ 2
    多实践下你才能体会到 ts 的优势,这种前端页面基本没有重写的必要性
    murmur
        4
    murmur  
       2019-02-11 16:04:30 +08:00
    ts 配合 angular 不错 就包括 vue 我拿 es5 都不存在什么问题
    murmur
        5
    murmur  
       2019-02-11 16:04:39 +08:00
    *react
    90928yao
        6
    90928yao  
       2019-02-11 16:11:33 +08:00
    你怕是对 超集 和 子集 有什么误解
    mmdsun
        7
    mmdsun  
       2019-02-11 16:17:25 +08:00 via Android
    动态一时爽,重构火葬厂。大项目才能体现出 typescript 的优势。
    tanszhe
        8
    tanszhe  
       2019-02-11 16:21:24 +08:00
    typescript 有可能会重新造个运行时 , 不用 v8。
    azh7138m
        9
    azh7138m  
       2019-02-11 16:24:34 +08:00 via Android
    @tanszhe 你们媒体记者,跑的比谁都快,你说这话是要负泽任的。引用开源呢?
    Rocka
        10
    Rocka  
       2019-02-11 16:30:28 +08:00
    @azh7138m #9 可能是在说 deno 吧 ... 不过并不是 TypeScript 造的
    Sapp
        11
    Sapp  
       2019-02-11 16:42:42 +08:00
    @mmdsun 小项目也照样能的,特别是现在 vscode 搭配 ts,最起码你写个函数不操心补全函数参数,函数参数类型这种问题了,调用方法直接输入名字,会自动导入对应的函数,比 js 方便多了。
    lxml
        12
    lxml  
       2019-02-11 16:51:16 +08:00 via Android
    @tanszhe 大概率还是 v8,不过是编译成 wasm 再利用 v8 的 runtime,写个运行时太蛋疼了,之前还可以指望微软,现在 edge 都靠拢 chrome 了,个人觉得投入人力不会干这种事了
    learnshare
        13
    learnshare  
       2019-02-11 16:53:22 +08:00
    回去继续学,继续写吧
    zhwithsweet
        14
    zhwithsweet  
       2019-02-11 16:56:54 +08:00
    @mmdsun #7 咳咳,ts 虽好。可是前端项目重构有点不现实,我经历的都是重写。或者项目还没完,就换工作了,重构至今没遇到过,有空才能打算搞搞。
    azh7138m
        15
    azh7138m  
       2019-02-11 17:00:16 +08:00 via Android
    @lxml 那个是 EdgeHTML 换 Blink,你们不要见得风是得雨

    ts 投入可是非常大的,一些重要特性都是 Anders 老爷子亲自写的( 96 年 300w 刀年薪)
    sneezry
        16
    sneezry  
       2019-02-11 17:03:29 +08:00 via iPhone   ❤️ 3
    理解楼主的心情。但是 ts 入门也没那么简单。原生 js 在 ts 下确实可以做到兼容,但是默认的 tsconfig 不行,的自己改。默认配置不支持的地方就是 ts 认为 js 不好的地方。如果想入 ts 的坑,建议放平心态,认真思考 ts 的“无理”要求。
    bumz
        17
    bumz  
       2019-02-11 17:12:14 +08:00   ❤️ 1
    建议把标题改成:
    「默认配置下的 ts 不是 javascript 的超集,这是微软在忽悠程序员吗」
    ianva
        18
    ianva  
       2019-02-11 17:33:01 +08:00   ❤️ 1
    ["我感到焦虑", "虽然快学不动了", "一直久仰大名", "我差点就信了", "难道我都需要一个个去改", "太费劲了"]
    基于焦虑的 TS 学习实践,这开始就是从入门到放弃的节奏
    geelaw
        19
    geelaw  
       2019-02-11 17:33:19 +08:00   ❤️ 1
    @90928yao #6 虽然楼主的错误在于没有认识 TypeScript 有严格配置,但是他对超集、子集的理解没什么问题。你应该检查你对超集、子集的理解。
    nakupanda
        20
    nakupanda  
       2019-02-11 17:42:29 +08:00
    推荐使用 vanillajs
    90928yao
        21
    90928yao  
       2019-02-11 17:44:56 +08:00
    @geelaw 哈哈 不好意思 丢人了 我没好好读题,会错他意思了
    cleveryun
        22
    cleveryun  
       2019-02-11 23:25:01 +08:00
    TS 可以配置的,报错提示归提示,但是照样可以编译运行的。另外,TS 也支持类似 JSDOC 代码注释来进行类型判断。
    cleveryun
        23
    cleveryun  
       2019-02-11 23:29:43 +08:00
    不想看报错就需要用 TS 对整个项目都重构掉,对老项目是比较激进,在对项目不熟悉的情况下重构风险还是比较大的,平稳过渡到类型判断的话,可以用 facebook 出的 flow,flow 在正式项目里用是没问题的,以前有在一个国内大型保险公司的某个外包团队里呆过几个月,那个项目好几年了,一直是用 flow 做类型检测的。
    quinoa42
        24
    quinoa42  
       2019-02-12 02:09:23 +08:00 via Android
    ts 的真正意义也不是在于做 js 超集,而是相对 type safe,减少深坑数量
    比如之前有过讨论的 https://www.v2ex.com/t/519845
    可以在 ts 里试试效果
    GiantHard
        25
    GiantHard  
       2019-02-12 09:36:27 +08:00
    @mmdsun 大项目的话,VSCode TS LSP 经常崩溃。。。
    wizardoz
        26
    wizardoz  
       2019-02-12 11:09:44 +08:00
    @quinoa42 还有一个很大的意义是对 IDE 更友好
    shunia
        27
    shunia  
       2019-02-12 12:33:56 +08:00
    @GiantHard 我 8G 内存而已,没遇到过崩的项目.是不是你电脑的问题?
    另外 TS LSP 是什么?
    edsheeran
        28
    edsheeran  
       2019-02-12 13:06:37 +08:00 via iPhone
    钓鱼执法
    GiantHard
        29
    GiantHard  
       2019-02-12 16:42:10 +08:00
    @shunia 我是 16 G 的 mbp,经常代码写着写着 TypeScript Language Service 就开始出各种各样的毛病(包括但不限于类型提示无法加载,错误信息乱报等),最后还是 JB 的 IDE 最稳。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2855 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:16 · PVG 22:16 · LAX 06:16 · JFK 09:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.