typescript 如何用Observable的泛型类型创建新的接口?

pzfprimi  于 2023-02-14  发布在  TypeScript
关注(0)|答案(2)|浏览(161)

假设我有一个具有一些可观测属性的接口,但接口的类型未知,有没有一种方法可以自动创建一个没有可观测属性的接口的新副本?
这里有一个例子:

interface SomeObject
{
  value1: Observable<string>;
  value2: boolean;
  value3: Observable<number>;
}

有没有一种方法可以创建一个新的接口,从将导致这一点?

interface SomeObjectWithoutObservable
{
  value1: string;
  value2: boolean;
  value3: number;
}

也许如果有一种方法可以做到这一点类似?

interface SomeObjectWithoutObservable extends RemoveObservable<SomeObject>
{}

只是不确定RemoveObservable会是什么样子。

xwbd5t1u

xwbd5t1u1#

我相信你可以通过这个方法来实现它:

type RmObservable<T extends object> = {
  [key in keyof T]: T[key] extends Observable<infer R> ? R : T[key];
};

interface SomeObjectWithoutObservable extends RmObservable<SomeObject> { }

演示:www.example.comhttps://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgPICMDO0Bud0A2EAPACoB8yA3gFDLJ4ECuEAXMqTQL402iSxEKAMoB7ALYQMAKwgIw1OgzjMIARnYZsUPIRKYwUUAHNyAbiWMWAJnbpRoonBAX6ViAGZNWXPiLEQJnF0aHNuXjAATwAHFAAlcS1fPTJkCAAPSBAAE0xkUXRZeUoAXkV6AG0AawhI5FBkGsjRGA4AXXZSatq2tMyIHLyknT8SUBhoZDjKAH4p5E7uyLaLLgs+cGh4JGQxSRk5MAB1YDAAC1EmMGHdIj6s3KnEnxGUvalCw8oqZB4gA

cxfofazt

cxfofazt2#

谢谢立花!这个答案很好。我只是想补充一个答案来扩展你的答案。我忘了说我总是在我的Observables属性名的末尾加上一个$。就像这样:

interface SomeObject
{
  value1$: Observable<string>;
  value2: boolean;
  value3$: Observable<number>;
}

因此,我还想删除结果中的$。所以我想出了这个:

type Replace<
  T extends string,
  S extends string,
  D extends string,
  A extends string = ''
> = T extends `${infer L}${S}${infer R}` ? Replace<R, S, D, `${A}${L}${D}`> : `${A}${T}`;

type RmObservable<T extends object> = {
  [key in keyof T & string as `${T[key] extends Observable<any> ? Replace<key, '$', ''> : key}`]: T[key] extends Observable<infer R> ? R : T[key];
};

interface SomeObjectWithoutObservable extends RmObservable<SomeObject> { }

替换功能的答案如下:https://stackoverflow.com/a/71353081/8916441
免责声明:我知道这并不完美,因为这将取代$在任何部分的属性名称,而不仅仅是在年底。但我不认为我需要担心在我的项目。

相关问题