[英]Is it possible to get the type from a generic, given as parameter
我创建了一个带有订阅者对象的函数,如下所示。
public subscribers = {
count: <EventEmitter<number>>new EventEmitter<number>(),
staticCount: <EventEmitter<number>>new EventEmitter<number>()
};
此函数等待两个可观察对象都完成,并返回一个带有接收到的对象的键的对象,作为从EventEmitter发出的值的值。
type AnyType<T> = {
[P in keyof T]: any;
}
function ZipObservable<T extends { [name: string]: EventEmitter<any>}>
(observables: T): Observable<AnyType<T>> {
const m = CreateMapFromObject(observables);
const o = new Subject<any>();
Observable.zip(...Array.from(m.values())).subscribe((res) => {
const keys = m.keys();
const c = res.reduce((r, v) => {
const k = <string>keys.next().value;
r[k] = v;
return r
}, {});
/**
*
*/
o.next(c);
o.complete();
});
return o.asObservable();
}
我当前的问题是在返回对象中设置的值的类型。 键入键的对象(如您在图像中看到的)。
我还希望将值的类型设置为数字(在这种情况下)。 我创建了一个类型; 能够将返回的对象设置为其键的AnyType<T>
。 是否还可以获取它来设置其值的类型?
我希望它成为的类型来自于接收通用值的参数; EventEmitter<number>
。
返回对象的工作类型安全性。
因此,您希望ZipObservable
返回类型为Observable<T>
的对象,其中输入参数与T
具有相同的键,但每个键K
的EventEmitter<T[K]>
(其中T[K]
是类型类型T
的K
键的属性值的值)。 通过映射类型和从映射类型的推断,绝对可以实现:
首先让我们定义一个映射类型,该类型接受T
每个属性并将其转换为适当类型的EventEmitter<>
:
type EventEmitters<T> = {
[K in keyof T]: EventEmitter<T[K]>
}
现在可以直接编写ZipObservable
函数签名(我将把实现留给您):
declare function ZipObservable<T>(eventEmitters: EventEmitters<T>): Observable<T>;
它之所以能够工作,是因为从映射类型推断出来:
const ret = ZipObservable(subscribers).subscribe(r => r.count * 3); // no error
希望能有所帮助; 祝好运!!
非常感谢@jcalz
你让我走上了正确的道路。 您的代码有效。 它虽然消除了我的类型安全性,所以我对其进行了一些调整。
- 编辑
它并没有消除我的类型安全性。 我的编辑器无法识别返回对象上的键。 当我使用以下代码时,它确实可以。
type EmittedReturnType<T> = {
[K in keyof T]: T[K]
}
type EventEmitters<T> = {
[K in keyof T]: EventEmitter<T[K]>
}
所以,
我创建了两种类型; 第一种类型为参数类型。 第二种类型是返回类型。
declare function ZipObservable<T>(observables: EventEmitters<T>): Observable<EmittedReturnType<T>>
结果是;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.