[英]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.