首页 > 解决方案 > 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 => {
         // ....
      });
   }
}

总结一下:

标签: typescriptrxjsobservabletypescript-typings

解决方案


在输入我的问题时,我意识到 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';

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-6.html#suppress-errors-in-ts-files-using--ts-ignore-comments上的文档状态:

// @ts-ignore使用注释抑制 .ts 文件中的错误

// @ts-ignoreTypeScript 2.6 支持使用位于违规行上方的注释来抑制 .js 文件中的错误。

注释会抑制源自下一行的// @ts-ignore所有错误。建议的做法是让 @ts-ignore 之后的其余评论解释正在抑制的错误。

这解决了我的问题。我想无论如何我都会为遇到同样问题的其他人分享它!


推荐阅读