保留引用指令上的属性
#57681
- 我们应该去掉
preserve="true"
吗? - 这会破坏
.d.ts
捆绑器吗? - 我们不知道。
- 当前的声明发射器只是生成新的指令。
- 我们喜欢保留文本作为原则。
- 不过这并不简单,很多东西已经重写了。
- 另外,你也可以从一个
.d.ts
中复制/粘贴并获得相同的行为。 - 此外,我们也应该修复 TmLanguage 文件以理解这些属性。
重新允许 Infinity
、 -Infinity
、 NaN
作为枚举成员名称
背景
- 很多年前,我们有一个原则,那就是枚举不能有数字名称。
- 没有
enum E { "10" = 42 }
- 因为这会破坏反向Map。
- 也就是说,
E[10]
Map到yadda
而不是42
- 但是人们想要将枚举成员命名为
Infinity
或NaN
- 由于这种做法很流行,所以我们允许了它。
- 但这仍然可能会在
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 中发布更好的规则。
通过非常量表达式缩小元素访问范围
- 我们长期以来一直希望能够缩小计算出的但实际上是常量值的范围。
- 一旦你证明了关于
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 名中的任何问题。
- 我们看到了编译器联合体中的一些轻微减速。
- 主要在噪音范围内。
4条答案
按热度按时间mqkwyuun1#
#57853 包含还原。
o3imoua42#
最后一节是关于#57847的:)
fv2wmkja3#
感谢您的提醒!已更新。
ve7v8dk24#
关于枚举反向Map的讨论,读起来像是一场拔河比赛的描述,然后在最后没有人赢-绳子松弛了,两队都掉进了泥里😝