【问题标题】:TypeScript - Can't "new" an interface for of an existing typeTypeScript - 不能“新建”现有类型的接口
【发布时间】:2014-01-21 07:19:52
【问题描述】:

我正在尝试在我正在编写的 TypeScript 应用程序中使用 RxJs 定义。我导入了 defs,现在我正在尝试新的主题。

this.stream = new Rx.Subject();

但是,当我尝试此操作时,出现以下错误。

错误 6 类型 '{ 的值上不存在属性 'Subject' 内部:{ 继承(子:函数,父:函数):函数; addProperties(obj: Object, ...source: Object[]): void; addRef(xs: Rx.IObservable, r: { getDisposable(): Rx._IDisposable; }): Rx.IObservable; };观察者:{ create(onNext: (value: any) => void, onError?: (例外: 任何) => void, onCompleted?: () => void): Rx.IO 观察者; fromNotifier(处理程序:(通知:Rx.INotification) => void): Rx.IObserver; }; }

当我查看此类型的定义时,我可以看到 Subject 类已被定义为接口

export interface Subject {
    (): ISubject;

    create(observer: IObserver, observable: IObservable): ISubject;
}

谁能告诉我如何创建这个 Subject 类的实例,因为我找不到方法。当前使用 TS 9.1.1。我认为 (): ISubject 可能会这样做,但似乎没有任何影响。

我知道一些建议是定义一个类,但是我需要从基接口实现所有方法,所以这将是巨大的,因为它继承自 IObservable。

【问题讨论】:

  • 您无法创建接口。是否在某处定义了 Subject 的类?
  • 这是一个 TS def 文件,RxJs 确实有一个 Subject ctor 函数,你可以更新它,但我在这里与类型系统作斗争。
  • 你从哪里得到的 def 文件?它不是 GitHub 上明确类型库中的当前版本。

标签: typescript rxjs


【解决方案1】:

使用最新版本的rx.js typing from Definitely Typed 可以工作。更新您的定义是可行的方法。

您也可以在 TypeScript Playground 上进行尝试 - 您需要粘贴来自“绝对类型”的代码来测试它(此处似乎不再允许使用指向该 Playground 的长链接)。

var x = new Rx.Subject();

【讨论】:

  • 为什么Subject在最新版本的rx.d.ts中仍然定义为接口? export interface Subject<T> extends ISubject<T>
  • 是的,在将我的类型定义更新到与 9.1.1 兼容的版本之后。我能够让它工作。
猜你喜欢
  • 2019-06-27
  • 2021-11-18
  • 2022-01-27
  • 2020-06-04
  • 2019-04-07
  • 2021-02-21
  • 2020-05-04
  • 1970-01-01
相关资源
最近更新 更多