TypeScript 函数重载与 Observable<T | T[]>



发帖希望有人比我聪明:有没有办法从下面的例子中摆脱as Observable<string[]>),并在函数过载上使用T和T[] ?

查看简化示例:

import { Observable } from 'rxjs';
class Test<T> {
test(flag : string) : Observable<T>;
test(flag : string) : Observable<T[]>;
test(flag : string) : Observable<T | T[]>
{
if (flag === 'foo')
{
return new Observable<T>();
}
return new Observable<T[]>();
}
}
const test : Test<string | string[]> = new Test();
test.test('foo');
(test.test('bar') as Observable<string[]>).subscribe(foo => foo.map(bar => bar));

查看真实的Angular示例:

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { OptionWithBodyInterface } from './common.interface';
import { CommonService } from './common.service';
import { MethodType } from './common.type';
import { createUrl } from './helper';
@Injectable()
export class RequestService<T> extends CommonService
{
public request(method : MethodType, options? : OptionWithBodyInterface) : Observable<T | T[]>
{
return this.http.request<T | T[]>(method, createUrl(this.getApiUrl(), this.getEndpoint()),
{
...this.getOptions(),
...options
});
}
}

为了记录,我想出了这个解决方案:

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { OptionsWithBody } from '../common';
import { CommonService } from '../common';
import { Method } from '../common';
import { createUrl } from '../common';
@Injectable()
export class RequestService<T> extends CommonService
{
public request<$ = T | T[]>(method : Method, options ?: OptionsWithBody) : Observable<$>
{
return this.http.request<$>(method, createUrl(this.getApiUrl(), this.getApiRoute()),
{
...this.getOptions(),
...options
});
}
}

最新更新