我使用角度5和离子3。 我有一个界面:
export interface IAny {
getDataSource: Observable<any>;
}
实现此接口的组件具有方法:
getDataSource () {
return Observable.of(['Item1', 'Item2', 'Item3'] as any)
};
这个方法应该返回不同类型的dataSources,有时候它会是简单的字符串数组,有些时间是对象数组,有些时候是简单对象。
有可能吗?
答案 0 :(得分:4)
这是可能的,但您不需要将数组转换为any
。
如果不这样做,在您的示例中,您的函数类型为() => Observable<string>
,类型与() => Observable<any>
兼容,这是接口中定义的方法的类型。
我的意思是,如果你有:
let a: () => Observable<any>;
let b: () => Observable<string>;
然后你可以这样做:
a = b;
因为any
与TypeScript中的任何类型兼容。
答案 1 :(得分:2)
你有几种方法可以做到这一点:
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)
};
答案 2 :(得分:1)
如果你像我一样,并希望尽可能避免“任何”类型(在这种情况下你的任何铸件),你可以使用Type Alias特别为你的价值。
看起来像这样:
// Just add your desired types that are possible return values
type DataSourceType = Array<string> | Array<object> | object;
您可以在TS Docs
找到有关类型别名的所有内容您甚至可以更进一步,用您的自定义类型替换通用对象类型。