TypeScript Design Meeting Notes, 3/19/2024

h9vpoimq  于 4个月前  发布在  TypeScript
关注(0)|答案(4)|浏览(36)

保留引用指令上的属性
#57681

  • 我们应该去掉 preserve="true" 吗?
  • 这会破坏 .d.ts 捆绑器吗?
  • 我们不知道。
  • 当前的声明发射器只是生成新的指令。
  • 我们喜欢保留文本作为原则。
  • 不过这并不简单,很多东西已经重写了。
  • 另外,你也可以从一个 .d.ts 中复制/粘贴并获得相同的行为。
  • 此外,我们也应该修复 TmLanguage 文件以理解这些属性。

重新允许 Infinity-InfinityNaN 作为枚举成员名称

背景

#56161
#57845

  • 很多年前,我们有一个原则,那就是枚举不能有数字名称。
  • 没有 enum E { "10" = 42 }
  • 因为这会破坏反向Map。
  • 也就是说, E[10] Map到 yadda 而不是 42
  • 但是人们想要将枚举成员命名为 InfinityNaN
  • 由于这种做法很流行,所以我们允许了它。
  • 但这仍然可能会在 enum E { Infinity = 1, yadda = 1/0 } 中引起问题。
  • 但如果你没有任何枚举初始化器等于 Infinity ,那又有什么问题呢?
  • 但我们无法静态分析这个问题。
  • 也许对于某些枚举来说这可以工作?特别是字符串枚举。

建议

  • 其实我们需要更严格的规则:
  • 所有值都是已知的。
  • 它们之间没有成员名称冲突。
  • 或者:
  • 如果所有值都是字符串。

讨论

  • 你实际上不能使用裸数字 -- 你必须用引号括起来。
  • 反向Map是一个错误。我们不应该做更多的事情。
  • 如果我们在具有此功能的字符串仅枚举上进行反向Map,会发生什么?
  • 如果是字符串仅枚举,那么这是可以接受的,因为不会有反向Map。
  • 如果 enum E { yadda = 'yadda' } 有反向Map,它会覆盖反向Map。而 Red = 'Red' 是超级常见的。
  • 但是等等。字符串仅枚举上没有反向Map。
  • 字符串仅枚举规则似乎没问题。
  • 将简单的回退作为 5.4 版本的补丁发布还不够好,所以应该等到 5.5 版本再发布更好的规则。
  • 不等待:我们将撤销 5.4 版本的 PR 并在此版本的 5.5 中发布更好的规则。

通过非常量表达式缩小元素访问范围

#57847

  • 我们长期以来一直希望能够缩小计算出的但实际上是常量值的范围。
  • 一旦你证明了关于 obj[key] 的一些事情,并且你既没有改变 obj 也未改变 key,那么类型系统确实应该理解这一点!
  • 在以前,由于通常整个问题是 key 通常是一个参数,或者在一个循环变量内变化,所以无法做到这一点。
  • 但现在我们已经有了对参数和 let 变量(它们实际上不会变异)以及捕获变量(在某个点后不再变异)的控制流分析。
  • 不是所有“亮起来”的方式都符合你的预期。
function f(obj: object, key: string) {
  if (key in obj) {
      obj[key]; // not allowed right now
  }
}
  • 由于我们不认为 obj 可索引,所以无法使其正常工作。
  • 从某种意义上说,你想让 obj 具有类型 object & Record<unique typeof key, unknown> 。真的不希望 obj 能够用所有的 string 来索引,只用 key 本身。
  • key 制造一个类型变量/存在量词。
  • 没有基线更改或前 200 名中的任何问题。
  • 我们看到了编译器联合体中的一些轻微减速。
  • 主要在噪音范围内。
o3imoua4

o3imoua42#

最后一节是关于#57847的:)

fv2wmkja

fv2wmkja3#

感谢您的提醒!已更新。

ve7v8dk2

ve7v8dk24#

关于枚举反向Map的讨论,读起来像是一场拔河比赛的描述,然后在最后没有人赢-绳子松弛了,两队都掉进了泥里😝

相关问题