我在查看RxJS的API文档。我经常遇到理解顶部奇怪语法的问题,例如下面的示例:
combineLatest<O extends ObservableInput<any>, R>(...observables: (O | ((...values: ObservedValueOf<O>[]) => R) | SchedulerLike)[]): Observable<R>
我希望能够理解这种语法,并进一步独立写出它。
因此,如果有人能够解释上面的例子中发生了什么,那将是非常有帮助的。
我在查看RxJS的API文档。我经常遇到理解顶部奇怪语法的问题,例如下面的示例:
combineLatest<O extends ObservableInput<any>, R>(...observables: (O | ((...values: ObservedValueOf<O>[]) => R) | SchedulerLike)[]): Observable<R>
function combineLatest<O extends ObservableInput<any>, R>(...observables: (O | ((...values: ObservedValueOf<O>[]) => R) | SchedulerLike)[]): Observable<R>
让我们分解一下。
这是一个函数。
function combineLatest(args): Result
这个函数需要一些参数,并返回一个类型为Result
的结果。
但它也是一种特殊的函数,被称为泛型函数。泛型的目的是在成员之间提供有意义的类型约束。
function combineLatest<T>(args): Result
/\
now it's a generic function
T
在这里是一个类型变量,它允许我们捕获用户提供的类型信息,以便我们稍后可以使用该信息。例如,我们可以将 T
用作返回类型:
function combineLatest<T>(args): T
为了使以下调用生效:
combineLatest<string>(someParams) // returns `string`
由于我们明确将 T
设置为 string
,因此将给出类型为 string
的结果。
我们还可以将 T
类型变量用于函数的任何参数。
function combineLatest<T>(arg: T): T
现在我们可以使用类型参数推断:
combineLatest('someStr') // returns `string`
T
的值。我们传递了一个string
,所以得到了一个string
。function combineLatest<Type1, Type2, ...>(...)
泛型很棒,有时我们想对传入的参数执行一些操作:
function combineLatest<T>(arg: T): T {
arg.name = arg.name.toLowerCase(); // Property 'name' does not exist on type 'T'
return arg;
}
正如您所看到的,编译器无法理解arg
的类型。为了解决这个问题,我们可以使用extends
运算符来表示对T
类型变量的约束:
interface ItemWithName {
name: string;
}
function combineLatest<T extends ItemWithName>(arg: T): T {
arg.name = arg.name.toLowerCase();
return arg;
}
现在编译器知道arg具有字符串的name
属性。
现在让我们回到初始声明:
combineLatest<O extends ObservableInput<any>, R>(...): Observable<R>
O
类型变量代表 Observable。它被限制为 ObservableInput<any>
类型。R
代表结果。combineLatest
函数的结果应该是类型为 R
的 Observable
。例如,我们可以通过以下方式强制指定类型:combineLatest<any, MyClass>(...) // returns Observable<MyClass>
...observables: (O | ((...values: ObservedValueOf<O>[]) => R) | SchedulerLike)[]
...observables: CombinedType[]
combineLatest
函数可以接受零个或多个参数,这些参数最终将被聚合到一个变量observables
中。combineLatest(); // without parameters
combineLatest(obs1); // one parameter
combineLatest(obs1, obs2, ..etc) // many parameters
那么这个参数的类型是什么?
CombinedType
O | ((...values: ObservedValueOf<O>[]) => R) | SchedulerLike
它可以是:
类型为O
的变量,其约束为我们之前讨论过的ObservableInput<any>
类型
或者它可以是函数(...values: ObservedValueOf<O>[]) => R
,它接受零个或多个ObservedValueOf<O>
类型的参数,并返回R
类型变量类型。请注意,此返回类型可用于推断combineLatest
函数的返回类型。
或者它可以是SchedulerLike
接口的类型。
如果您将TypeScript类型声明分解成小块,我认为不应该存在任何理解上的问题。