typescript - Typescript:如何使用可选外部库的类型
问题描述
我正在尝试使用rxjsObservable
中的类型作为我自己库中方法的返回值,但我不想将rxjs依赖项添加到我的项目中。它是可选的,只有在我的库的用户实际使用这些特定方法时才需要,在这种情况下,他们必须自己将rxjs安装到他们的项目中。observe
我找不到正确的打字稿语法。
以下代码总结了我现在如何使用它,如果使用我的库的项目中未安装rxjs ,则会出现 TypeScript 错误:“找不到模块 'rxjs' 或其相应的类型声明.ts(2307) ”
我已将Observable导入隔离到一个文件中,因此我可以从多个实现observe
方法的类(文件)中引用它。另外,请注意,我使用的是我自己的类型定义文件,而不是使用tsc生成它们,以防止在我的库中公开私有和/或实验 API。
类型/可选-observable.d.ts:
export { Observable } from 'rxjs'; // Error if rxjs is not in project, needs fixing
类型/数据-reference.d.ts:
import { Observable } from './optional-observable';
export class DataReference {
// many other properties and methods
observe(): Observable<any>
observe<T>(): Observable<T>
}
在可选 observables 的实现中,我使用以下代码:
src/optional-observable.ts:
export function getObservable() {
try {
const { Observable } = require('rxjs');
if (!Observable) { throw new Error('not loaded'); }
return Observable;
}
catch(err) {
throw new Error(`RxJS Observable could not be loaded. Add it to your project with: npm i rxjs`);
}
}
src/data-reference.ts:
import { getObservable } from './optional-observable';
export class DataReference {
observe() {
const Observable = getObservable(); // throws if rxjs not installed, which is ok
return new Observable(observer => {
// ....
});
}
}
总结一下:
- 我的库中有需要rxjs Observables才能工作的方法,但它们是可选的
- 如果我的库的用户使用这些方法,他们必须将rxjs依赖项添加到他们的项目中
- 如果安装了rxjs,则自动完成功能可用于我
observe
在 IDE 中的方法 - 如果未安装rxjs,则必须没有编译时错误。
解决方案
在输入我的问题时,我意识到 TypeScript 编译器可能会忽略rxjs
使用 linting 样式注释来tsc
忽略错误的缺失。原来我所要做的就是添加// @ts-ignore
到导出上方的行:
类型/可选-observable.d.ts:
// @ts-ignore: rxjs dependency is optional and only needed when using methods that require them
export { Observable } from 'rxjs';
// @ts-ignore
使用注释抑制 .ts 文件中的错误
// @ts-ignore
TypeScript 2.6 支持使用位于违规行上方的注释来抑制 .js 文件中的错误。注释会抑制源自下一行的
// @ts-ignore
所有错误。建议的做法是让 @ts-ignore 之后的其余评论解释正在抑制的错误。
这解决了我的问题。我想无论如何我都会为遇到同样问题的其他人分享它!
推荐阅读
- scala - groupby scala 字符串列表
- javascript - 使用 php、javascript 和 ajax 进行简单登录
- java - 使用 CriteriaQuery 选择通用主键
- c++ - 使用 C++ 导出注册表
- sqlite - GDX-SQLite android.database.CursorIndexOutOfBoundsException:请求索引 -1,大小为 1
- java - 如何使用带有jpa的spring boot一起软删除父母和孩子(级联)
- php - 未从数据库中获取数据
- debugging - oc debug pod 使用最新图像而不是调试过的原始图像
- mysql - MySQL插入触发日期检查
- excel - 复制不相邻的单元格并粘贴转置但不粘贴到整行