在 Web Worker 中导入 tensorflow 时出现 Angular 打字稿类型检查问题

Was*_*abi 6 web-worker typescript tsconfig tensorflow angular

我正在尝试在 angular 项目的网络工作者中使用 tensorflow/tfjs (TF)。

使用该ng generate worker命令创建 web-worker工作正常。

在组件中导入 TF 也很好。

但是,在工作人员中导入 TF,即:

import * as tf from '@tensorflow/tfjs'
Run Code Online (Sandbox Code Playgroud)

通过ng build命令构建时会生成一堆缺少定义的错误。缺少的类型通常是与 DOM 相关的类型,例如error TS2304: Cannot find name ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement. 这些类型在 TF 的某些定义中使用,据我所知,这些类型不能被 web-workers 访问,因为DOM 操作不能从 workers 完成。我对此非常满意,我对 TF 的使用不依赖于这些类型。但是我仍然需要找到一种方法来构建我的工人。

因此,我试图修补该tsconfig.worker.json文件。我的第一次尝试是通过在compilerOptions.lib数组中添加“dom”来模仿其他 tsconfig* 文件:

["es2018", "webworker"] 
Run Code Online (Sandbox Code Playgroud)

取而代之

["es2018", "webworker", "dom"]
Run Code Online (Sandbox Code Playgroud)

这会导致类型定义冲突

error TS6200: Definitions of the following identifiers conflict with those in another file 
Run Code Online (Sandbox Code Playgroud)

webworkerDOM库有相同类型的不同的定义,但我当然不能去除webworker LIB参考。

我的第二次尝试是skipTypeChecktsconfig.worker.json文件中添加编译器选项: 效果很好,我在我的网络工作者中运行了 TF 并输出结果。

但...

跳过类型检查感觉就像是在破坏使用 typescript 的整个想法。所以我的问题是:

在保留类型检查的同时,是否有一种更干净的方法可以在 angular 的 webworker 中使用 TF?

感谢您的回答。如果我应该提供更多配置细节,请告诉我。

Ale*_*kin 0

来自官方 TensorFlow 教程:https://www.tensorflow.org/js/tutorials/setup

使用 TypeScript 时,如果您的项目使用严格的 null 检查,您可能需要在 tsconfig.json 文件中设置skipLibCheck: true,否则您将在编译过程中遇到错误。

skipTypeCheck这比仍然检查代码中的类型要好。这样代码可以编译,但控制台中仍然会出现错误:Error when getting WebGL context: Error: Cannot create a canvas in this context

但到目前为止这还不是问题。