繁体   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