如何让 TypeScript 加载 cordova 插件中包含的类型

How to get TypeScript to load typings included with a cordova plugin

我在用 TypeScript (3.0.1) 编写的基于 cordova 的应用程序中使用 cordova-plugin-camera,我希望能够看到该插件的类型。

所以我使用 npm 安装包 @types/cordova-plugin-camera。在安装过程中 npm 显示 WARN deprecated 解释不需要这个 @types 包,因为类型已经包含在包 cordova-plugin-camera 中。因此我再次删除包。

然后我开始编译,但编译失败 error TS2339: Property 'camera' does not exist on type 'Navigator'。我的理解是,这应该开箱即用(至少对于 @types 包),但 TypeScript 似乎不知道它应该包括直接来自 cordova-plugin-camera 的类型。这似乎是合乎逻辑的,因为我没有明确的声明告诉它 import 'cordova-plugin-camera',但没有必要,因为我只使用由 cordova 加载的全局可用对象。

如何让 TypeScript 直接从 cordova-plugin-camera 加载类型?


我已经尝试过的可能解决方案


import 'cordova-plugin-camera'

在我的情况下不起作用,因为我工作的项目很旧并且不支持模块。它只使用 outFile"module": "none".

生成一个文件

⚠️ 在tsconfig.json

中使用types属性

添加

"types": [ 
  "cordova-plugin-camera" 
]

tsconfig.json 适用于 cordova-plugin-camera,但会导致 TypeScript 停止为所有其他包加载类型,因此我必须将每个带有类型的包添加到我的 tsconfig.json .


⚠️ 在tsconfig.json

中使用typeRoots属性

添加

"typeRoots": [
  "./node_modules/@types",
  "./node_modules/cordova-plugin-camera"
]

to tsconfig.json 适用于 cordova-plugin-camera 和其他包,但在 cordova-plugin-camera 中不包含类型的每个文件夹的构建过程中会导致选项错误:

error TS2688: Cannot find type definition file for '.github'.
error TS2688: Cannot find type definition file for 'appium-tests'.
error TS2688: Cannot find type definition file for 'doc'.
error TS2688: Cannot find type definition file for 'jsdoc2md'.
error TS2688: Cannot find type definition file for 'src'.
error TS2688: Cannot find type definition file for 'tests'.
error TS2688: Cannot find type definition file for 'www'.

使用 ./node_modules/cordova-plugin-camera/types 而不是 ./node_modules/cordova-plugin-camera 会导致 TypeScript 找不到类型,而使用 ./node_modules 会导致每个没有类型的包出现选项错误。


✅ 使用 /// <reference types="cordova-plugin-camera" />

/// <reference types="cordova-plugin-camera" /> 添加到我的一个 TypeScript 文件适用于 cordova-plugin-camera 和所有其他包而不会导致错误。但是只添加对任何一个 TypeScript 文件的引用(哪个并不重要,只要它包含在构建中)对我来说似乎不正确。


还有没有尝试过的方法? 解决这个问题的正确方法是什么?

我相信 /// <reference types="cordova-plugin-camera" /> 是正确的方法。对于不使用模块的项目,您可以将其视为 import 'cordova-plugin-camera' 的类比。在任何一种情况下,您都必须任意选择一个文件来保存该指令(或者您可以根据需要将其放在多个文件中;这没有区别)。

开箱即用,only @types packages are automatically included,所以如果您使用提供全局声明的非 @types 包,我猜您应该使用 /// <reference types="..."/>import '...'.

我的项目在 Angular 中,使用 Cordova 为设备打包。我将不得不在 Angular 和 Cordova 这两个项目中导入该库。我没有找到好的和干净的选项,所以我放弃了打字并使用了“declare”:

declare var Camera: any
declare var navigator: any

export const getPicture = () => new Promise((resolve, reject) => {
    const options = {
        quality: 50,
        destinationType: Camera.DestinationType.DATA_URL
    }
    navigator.camera.getPicture(resolve, reject, options)
})

它就像一个魅力。