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

Bas*_*ann 4 typescript angular

我正在尝试使用此处发布的解决方案在我的 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())
Run Code Online (Sandbox Code Playgroud)

TypeScript 给了我以下错误:

Operator '+' cannot be applied to types 'number[]' and '-1000'.
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

hgo*_*ebl 5

如果你想留下某种神秘的代码(一个谜题?),就像它是巧妙的原创但兼容 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)
    }
  )
}
Run Code Online (Sandbox Code Playgroud)

解读:

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

这是“只需将您的 *.js 文件重命名为 *.ts 并且您拥有有效的 TypeScript”的另一个证明,并非在所有情况下都是如此。我仍然相信使用 TypeScript 很快就会有回报,而且这样的小改动不会花费太多。