如何让 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)
})
它就像一个魅力。
我在用 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)
})
它就像一个魅力。