簡體   English   中英

是否有可能從泛型中獲取類型,以參數形式給出

[英]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具有相同的鍵,但每個鍵KEventEmitter<T[K]> (其中T[K]是類型類型TK鍵的屬性值的值)。 通過映射類型從映射類型的推斷,絕對可以實現:

首先讓我們定義一個映射類型,該類型接受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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM