- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在检查 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
类型的结果
但它也是一种特殊的函数,称为generic职能。泛型的目的是在成员之间提供有意义的类型约束。
function combineLatest<T>(args): Result
/\
now it's a generic function
T
这是一个类型变量,它允许我们捕获用户提供的类型,以便我们以后可以使用该信息。例如,我们可以使用 T
作为返回类型:
function combineLatest<T>(args): T
以便进行以下调用:
combineLatest<string>(someParams) // returns `string`
将为我们提供 string
类型的结果因为我们明确设置了 T
成为string
.
我们也可以使用 T
函数的任何参数的类型变量。
function combineLatest<T>(arg: T): T
现在我们可以使用类型参数推断:
combineLatest('someStr') // returns `string`
也就是说,我们告诉编译器设置 T
的值根据我们传入的参数类型自动为我们提供服务。我们已经传递了一个 string
。这样我们就有了一个string
.
我们可以根据需要使用任意数量的类型变量。我们也可以随意调用它们。
function combineLatest<Type1, Type2, ...>(...)
泛型很棒,有时我们想用我们传入的参数做一些 Action :
function combineLatest<T>(arg: T): T {
arg.name = arg.name.toLowerCase(); // Property 'name' does not exist on type 'T'
return arg;
}
如您所见,编译器无法理解 arg
的类型。 .为了解决这个问题,我们可以为我们的 T
表示约束在 extends
的帮助下键入变量运算符(operator):
interface ItemWithName {
name: string;
}
function combineLatest<T extends ItemWithName>(arg: T): T {
arg.name = arg.name.toLowerCase();
return arg;
}
现在编译器知道 arg 有 name
string
的属性(property).
现在让我们回到最初的声明:
combineLatest<O extends ObservableInput<any>, R>(...): Observable<R>
我们可以看到这个函数使用了两个类型变量:
O
代表 Observable 的类型变量。它被限制为 ObservableInput<any>
的类型R
代表结果combineLatest
的结果功能应该是Observable
类型 R
.例如,我们可以通过像这样调用此函数来强制使用该类型:
combineLatest<any, MyClass>(...) // returns Observable<MyClass>
现在让我们看看这个函数可以接受的参数:
...observables: (O | ((...values: ObservedValueOf<O>[]) => R) | SchedulerLike)[]
我们可以看到rest parameters运营商在这里。让我们简化上面的表达式,想象一下:
...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 类型声明拆分成小块,理解它们应该没有任何问题。
关于angular - 如何理解复杂的 TypeScript 泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57051334/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!