【问题标题】:Why does the browser understand this snippet, but my typescript compiler doesn't?为什么浏览器能理解这个片段,而我的 typescript 编译器却不能?
【发布时间】:2018-11-02 01:49:30
【问题描述】:

当我遇到这个 sn-p 时,我正在阅读别人的代码。

let array = Array(100)
   .fill()
   .map(_ => { 
       return Math.floor(Math.random() * 100 + 1)) 
   });

当我自己实现这个时,我的 typescript 编译器抛出了一个错误,“错误 TS2554: Expected 1-3 arguments, but got 0.”,这是有道理的。数组函数 .fill() 至少需要一个参数。将数组记录到浏览器的控制台时,我看到实际上已经生成了 100 个随机数并映射到数组中。这就是我的困惑开始的地方。

我确实有一些想法......我在我的 tsconfig 中瞄准 es5。对我来说有意义的是 .fill() 的实现在 ES6 中发生了变化,并且浏览器能够理解代码,因为它不违反 ES6 标准,但是 typescript 编译器正在针对 ES5 进行验证,它确实违反了标准。

【问题讨论】:

  • 你为什么叫填充?关于 Typescript,你真的不能因为抱怨而责怪它,因为签名确实需要一个值来填充它。
  • @ChaosPandion 所以 map() 运行....
  • @epascarello - 我不明白这一点。 map 函数是在 Array 原型上定义的,所以调用 Array(100) 就足够了。
  • 不,map 不会在未初始化的索引上运行.... 试试看。 Array(10).map(()=>Date.now())
  • @chaosPandion .map 跳过空槽,使用.fill() 将空槽转换为undefined 使用.map 迭代的槽。

标签: javascript typescript ecmascript-6


【解决方案1】:

只需显式传递undefined 而不是隐式传递:

  .fill(undefined)

这不是 JavaScript 错误,因为 JS 会隐式传递 undefined,但来自 TS 的一个错误提示您隐式传递的参数不利于可读性。


顺便说一句,单线:

  const array = Array.from({ length: 100 }, () => Math.floor(Math.random() * 100 + 1));

【讨论】:

  • 啊,现在更有意义了。我不知道 javascript 传递隐式传递未定义。每天学习新东西!谢谢大佬。
  • @CodyBentson:更准确地说,每个未传递参数的参数都设置为undefined。类似于var foo;foo 设置为undefined
猜你喜欢
  • 2021-05-26
  • 2014-03-13
  • 1970-01-01
  • 2023-03-06
  • 2015-11-13
  • 1970-01-01
  • 2019-03-01
  • 2018-12-02
  • 2011-11-27
相关资源
最近更新 更多