【问题标题】:Observable<any> is not assignable to type Observable<any>Observable<any> 不可分配给类型 Observable<any>
【发布时间】:2018-08-30 06:26:51
【问题描述】:

我正在使用 angular 5 和 ionic 3。 我只有一个界面:

export interface IAny {
    getDataSource: Observable<any>;
}

实现该接口的组件有方法:

getDataSource () {
      return Observable.of(['Item1', 'Item2', 'Item3'] as any)
 };

这个方法应该返回不同类型的数据源,有时是简单的字符串数组,有时是对象数组,有时是简单对象。

有可能吗?

【问题讨论】:

  • 如果你尝试它是否有效:return Observable.of( ...
  • ['Item1', 'Item2', 'Item3'] 不是任何数组,而是任何数组,因此:['Item1', 'Item2', 'Item3'] as any[]

标签: angular typescript ionic3 observable


【解决方案1】:

你有几种方法:

return Observable.of<any>(['Item1', 'Item2', 'Item3'])
return Observable.of(['Item1', 'Item2', 'Item3']) as any
return Observable.of(['Item1', 'Item2', 'Item3']) as Observable<any> // For code completion

一切都应该工作。您可以将 any 替换为您的类型。

顺便说一下,你的界面应该是这样的

export interface IAny {
    getDataSource(): Observable<any>;
}

你声明一个函数,而不是一个变量。

更好的是,正如@nicowernli 建议的那样,如果您想即时输入返回值,请使用泛型类型声明您的接口和函数:

export interface IAny {
  getDataSource<T>(): Observable<T>;
}

getDataSource<T>() {
  return Observable.of(['Item1', 'Item2', 'Item3'] as any)
};

【讨论】:

  • 为什么投反对票?这是一个完全有效的答案。
  • 没错,这是完全有效的答案,我还要说使用泛型是您可以获得的最佳解决方案
  • @nicowernli 我同意,但是你能声明一个通用类型的接口吗?
  • 在这两种情况下我仍然会出错。也许那只是 VS2015 类型的脚本 linter,但错误仍然存​​在。在第一个示例中,错误是相同的。在第二个示例中,错误是:any' is notassignable to type 'Observable'.
  • @tricheriche 你说得对,如果接口声明为()=&gt;Observable&lt;any&gt;,它就可以工作。也许你应该编辑你的答案以明确这一点。
【解决方案2】:

如果你和我一样,想尽可能避免使用“any”类型(在这种情况下是你的 any-castings),你可以使用类型别名,特别是为了你的价值。

它可能看起来像这样:

// Just add your desired types that are possible return values
type DataSourceType = Array<string> | Array<object> | object;

您可以在 TS Docs 找到有关类型别名的所有信息

您甚至可以更进一步,将通用对象类型替换为您的自定义类型。

【讨论】:

  • 我考虑过他的实现,但选择了'any',因为它的代码更少:),但你是对的,这是一个更好的方法。
【解决方案3】:

这是可能的,但您不需要将数组转换为any

如果您不这样做,在您的示例中,您的函数是 () =&gt; Observable&lt;string&gt; 类型,该类型与 () =&gt; Observable&lt;any&gt; 兼容,这是接口中定义的方法的类型。

我的意思是,如果你有:

let a: () => Observable<any>;
let b: () => Observable<string>;

那么你可以这样做:

a = b;

因为any 与 TypeScript 中的任何类型都兼容。

【讨论】:

  • 如果我删除演员表,我会得到错误。 Observable' 不可分配给类型 'Observable'。我什至尝试更改接口以接受 Observable',但没有成功。
  • 问题出在我的界面中,当我修复它时,它可以工作。谢谢。
猜你喜欢
  • 2018-08-14
  • 2023-04-10
  • 2017-08-12
  • 2020-05-28
  • 2019-04-22
  • 2018-03-09
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多