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

标签 angular typescript

我正在尝试使用发布的解决方案 here在我的 angular4/TypeScript 网络应用程序中创建一个 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 兼容?

谢谢!

最佳答案

如果你想留下一些神秘的代码(一个谜题?)几乎就像它是巧妙的原始但 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 不知道该表达式旨在生成一个字符串。 (这可以被视为错误恕我直言。)
  • 当您以 '' + 开始表达式时,类型推断会将表达式检测为字符串,并且编译器现在接受将数组与数字连接起来。更具可读性的形式是 '' + 1e7 + -1e3 + -4e3 + -8e3 + -1e11,因为这样你就不再需要 [] 来处理 + 运算符作为字符串连接而不是数字加法。
  • 下一个问题是 c 从字符串到数字的自动强制转换。为此,我添加了从作为字符串的 ch 到作为数字的 c 的显式转换。

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

关于angular - 在 TypeScript 中创建 GUID - 函数在 JS 中有效但在 TS 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45209269/

相关文章:

javascript - 在 Angular2 中使用动态组件加载器进行双向数据绑定(bind)

TypeScript:使接口(interface)字段成为必需,但仅限于数组类型

typescript - Typescript 中 Mongoose 模式的函数参数类型?

javascript - 在 rxjs 中,使用 BehaviorSubject 存储数据与 javascript 对象相比是否有开销?

angular - 源具有X个元素,但目标仅允许1个

javascript - 遍历 Typescript 中的对象数组

javascript - 为什么我无法在 Ionic 4 中创建 radio 警报?

Angular Material 选择: change color of disabled option

Angular 2 .focus() 不工作

angular - 缓存破坏 serviceworker index.html 文件的问题