在TypeScript中创建GUID - 函数在JS中有效但不在TS

时间:2017-07-20 08:22:44

标签: angular typescript

我正在尝试使用已发布的here解决方案在angular4 / TypeScript Web应用程序中创建GUID类型的字符串。

这是我写的函数:

function uuidv4() {
  return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
    (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
  )
}
console.log(uuidv4())

TypeScript给出了以下错误:

Operator '+' cannot be applied to types 'number[]' and '-1000'.

我需要更改什么才能使此TS兼容?

谢谢!

1 个答案:

答案 0 :(得分:2)

如果你想留下一些神秘的代码(一个谜题?),几乎就像它的巧妙原创但TypeScript兼容,你可以使用:

function uuidv4(): string {
  return (''+[1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, ch => {
      let c = Number(ch);
      return (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
    }
  )
}

未加扰的:

  • [1e7]+-1e3+-4e3+-8e3+-1e11生成字符串10000000-1000-4000-8000-100000000000并保存令人难以置信的字符数量; - )
  • TypeScript不知道该表达式旨在生成字符串。 (这可以被视为bug恕我直言。)
  • 当您使用'' +启动表达式时,类型推断将表达式检测为字符串,编译器现在接受将数组与数字连接。更易读的形式是'' + 1e7 + -1e3 + -4e3 + -8e3 + -1e11,因为您不再需要[]+运算符视为字符串连接而不是数字加法。
  • 下一个问题是c从字符串到数字的自动强制。为此,我添加了从ch作为字符串到c的显式转换作为数字。

这是另一个证明"只是将* .js文件重命名为* .ts并且你有有效的TypeScript"在所有情况下都不是这样。我仍然相信使用TypeScript会很快得到回报,这种小小的改变并不会花费太多。