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

从私有静态成员看 TypeScript 和 ES 规范的冲突,请问大佬该写法是否有解决方案或 TS 相关的最新提案?

  •  
  •   JayLin1011 · 2020-12-12 12:10:06 +08:00 · 2110 次点击
    这是一个创建于 1442 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学 TypeScript 遇到几个问题和疑惑:

    1. 静态属性修饰符 static 和私有类字段前缀 # 互斥;
    2. 类字段定义的实例属性作为方法使用时,装饰器语法失效;
    3. 私有属性修饰符 private# 定义的属性的行为差异,前者开发时提示,编译后类外部仍可以访问该属性,类似伪私有属性,后者任何时候都不能在类外部访问。

    对于问题 2 和问题 3,我能结合 JS 求同存异,对于问题 1,是我最不能理解的一点。TypeScript 作为 JavaScript 的超集,在我未正式接触的感知中,我一直以为祂是完全兼容 JS 语法或者说直觉祂是对 ES 规范的一种更强大的实现,问题 1 语法在高版本浏览器即使不借助 Babel 编译转化也可以正常执行,TS 却不支持,这是我标题的想要表达疑惑所在,想请问有没有具体的解决方案或者进程中的提案。

    我的方案(目前测试项目是基于 rollup 构建的):

    1. rollup & Babel 生态支持伪 TypeScript [ Done ] 借助 Babel 的预设或者插件可以解决问题一,但这是会丧失 type check,这显然违背了使用 TS 的初衷,不到万不得已本人并不想采用此方案;

    2. rollup & TypeScript [ TODO ] 使用了 rollup 的 TypeScript 插件,其中在 TS 编译之前转化代码的 before 钩子配置,我尝试使用 Babel 的编译功能作为 TS 编译的前置钩子,也就是在 TS 真正编译之前先让 Babel 转化 static #propName 语法,然后再让 TS 编译,目前是理论阶段,因为我的工厂函数失效了,不知道有没有大佬尝试过 before 转化这种 rollup 的 TS 插件配置,请问此思路是否存在可行性。

    6 条回复    2021-01-18 02:21:21 +08:00
    anguiao
        1
    anguiao  
       2020-12-12 12:43:39 +08:00 via Android
    没有系统学过 TS,但是私有属性好像还在 stage 3 吧,并没有正式发布。
    而且刚刚搜了一下,TS 3.8 的公告里面有提到支持了私有属性。
    JayLin1011
        2
    JayLin1011  
    OP
       2020-12-13 01:36:26 +08:00
    @anguiao 感谢回复,这个更新我知道,默认安装 LTS 版本已经就是 v4+了, `#` 前缀一直可以使用,问题主要在于和 `static` 的共同工作,以及 AST 层面的 `trnasformer` 实现。
    MrYELiex
        3
    MrYELiex  
       2020-12-13 09:58:08 +08:00
    有啥办法 谁让 es 规范用这种奇奇怪怪的关键字做私有变量 用是不可能用的 这辈子都不可能 只有靠 ts 了
    JayLin1011
        4
    JayLin1011  
    OP
       2020-12-13 14:57:28 +08:00
    @MrYELiex 本末倒置,规范才是根本,就好像先有构造函数才有对象,JS / TS 之类的语言都是根据 ES 规范这个构造函数来实例化的, 而且 TS 这是伪私有变量,肯定要有一个真正实现私有的变量的提案。
    JayLin1011
        5
    JayLin1011  
    OP
       2020-12-13 23:31:29 +08:00
    此问题已解决。

    借鉴了 `Vue.js` 源码工程化方案和 `TypeScript` 的官方推荐后,使用改进版的方案 1+,即使用 `rollup.js & Babel` 生态支持 `TypeScript` 语法和生成 JS 文件,使用 `tsc` 检查类型和生成声明文件。

    PS: 关于方案 2 的 `transformer` 可以加强 `AST` 的认知和 `Babel` 生态的了解。
    xcstream
        6
    xcstream  
       2021-01-18 02:21:21 +08:00
    要么改 ts
    要么放弃兼容
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2605 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:43 · PVG 12:43 · LAX 20:43 · JFK 23:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.