映射不正确的值

发布于 2025-02-13 11:09:45 字数 4199 浏览 1 评论 0原文

我正在尝试将多个可观察物映射到一个可观察的可观察使用rxjs combineLatest。当我试图映射6个可观测值时,这先前是在工作,但是当添加一个5时,编译器似乎对映射感到困惑。这是所讨论的逻辑:

interface ReferenceData {
    observableOne: ArrOne[];
    observableTwo: ArrTwo[];
    observableThree: ArrThree[];
    observableFour: ArrFour[];
    observableFive: ArrFive[];
    observableSix: ArrSix[];
    observableSeven: ArrSeven[];
    observableEight: ArrEight[];
    observableNine: ArrNine[];
    observableTen: ArrTen[];
    observableEleven: ArrEleven[];
}

export class ReviewComponent extends BaseComponent implements OnInit, AfterViewInit {

 observableOne$: Observable<ArrOne[]>;
 observableTwo$: Observable<ArrTwo[]>;
 observableThree$: Observable<ArrThree[]>;
 observableFour$: Observable<ArrFour[]>;
 observableFive$: Observable<ArrFive[]>;
 observableSix$: Observable<ArrSix[]>;
 observableSeven$: Observable<ArrSeven[]>;
 observableEight$: Observable<ArrEight[]>;
 observableNine$: Observable<ArrNine[]>;
 observableTen$: Observable<ArrTen[]>;
 observableEleven$: Observable<ArrEleven[]>;

 referenceData$: Observable<ReferenceData>;

  ngOnInit(): void {
        this.getReferenceData();
        this.createSingleReferenceDataObservable();
    }

  getReferenceData() {
        this.observableOne$ = this.entityService.get('TestDataOne');
        this.observableTwo$ = this.entityService.get('TestDataTwo');
        this.observableThree$ = this.entityService.get('TestDataThree');
        this.observableFour$ = this.entityService.get('TestDataFour');
        this.observableFive$ = this.entityService.get('TestDataFive');
        this.observableSix$ = this.entityService.get('TestDataSix');
        this.observableSeven$ = this.entityService.get('TestDataSeven');
        this.observableEight$ = this.entityService.get('TestDataEight');
        this.observableNine$ = this.entityService.get('TestDataNine');
        this.observableTen$ = this.entityService.get('TestDataTen');
        this.observableEleven$ = this.entityService.get('TestDataEleven');
   }

    createSingleReferenceDataObservable() {
            this.referenceData$ = combineLatest([
                this.observableOne$, 
                this.observableTwo$, 
                this.observableThree$, 
                this.observableFour$, 
                this.observableFive$, 
                this.observableSix$, 
                this.observableSeven$, 
                this.observableEight$, 
                this.observableNine$, 
                this.observableTen$, 
                this.observableEleven$
            ])
            .pipe(
                map(([
                    ArrOne, 
                    ArrTwo, 
                    ArrThree, 
                    ArrFour, 
                    ArrFive, 
                    ArrSix, 
                    ArrSeven, 
                    ArrEight, 
                    ArrNine, 
                    ArrTen, 
                    ArrEleven
                ]) => {
                    return {
                        ArrOne, 
                        ArrTwo, 
                        ArrThree, 
                        ArrFour, 
                        ArrFive, 
                        ArrSix, 
                        ArrSeven, 
                        ArrEight, 
                        ArrNine, 
                        ArrTen, 
                        ArrEleven
                    }
                })
            );
        }
    
    }

编译器给出以下错误:

键入'可观察&lt; {arrone:arrone []; arrtwo:arrone []; arrthree: arrone []; arrfour:arrone []; arrfive:arrone []; arrsix:arrone []; arrseven:arrone []; Arreight:Arrone []; arrnine:arrone []; arrten: arrone [];到达:arrone []; }&gt;'不能分配给类型 “可观察”。键入'{arrone:arrone []; arrtwo: arrone []; arrthree:arrone []; arrfour:arrone []; arrfive:arrone []; arrsix:arrone []; arrseven:arrone []; Arreight:Arrone []; arrnine: arrone []; arrten:arrone [];到达:arrone []; }'缺少 以下来自类型为“ ReferenceData”的属性:可观察酮, observabletwo,observablethree,observablefour和7个。

这很奇怪,因为如果我将可观察值的数量减少到六个,然后从referenceedata接口中删除相应的值,则编译器不会丢弃此错误。

有什么想法吗?

I'm trying to map multiple observables into one single observable use RXJS CombineLatest. This was previously working when I was trying to map 6 observables but when adding an additional 5, the compiler seems to get confused about the mapping. This is the logic in question:

interface ReferenceData {
    observableOne: ArrOne[];
    observableTwo: ArrTwo[];
    observableThree: ArrThree[];
    observableFour: ArrFour[];
    observableFive: ArrFive[];
    observableSix: ArrSix[];
    observableSeven: ArrSeven[];
    observableEight: ArrEight[];
    observableNine: ArrNine[];
    observableTen: ArrTen[];
    observableEleven: ArrEleven[];
}

export class ReviewComponent extends BaseComponent implements OnInit, AfterViewInit {

 observableOne$: Observable<ArrOne[]>;
 observableTwo$: Observable<ArrTwo[]>;
 observableThree$: Observable<ArrThree[]>;
 observableFour$: Observable<ArrFour[]>;
 observableFive$: Observable<ArrFive[]>;
 observableSix$: Observable<ArrSix[]>;
 observableSeven$: Observable<ArrSeven[]>;
 observableEight$: Observable<ArrEight[]>;
 observableNine$: Observable<ArrNine[]>;
 observableTen$: Observable<ArrTen[]>;
 observableEleven$: Observable<ArrEleven[]>;

 referenceData$: Observable<ReferenceData>;

  ngOnInit(): void {
        this.getReferenceData();
        this.createSingleReferenceDataObservable();
    }

  getReferenceData() {
        this.observableOne$ = this.entityService.get('TestDataOne');
        this.observableTwo$ = this.entityService.get('TestDataTwo');
        this.observableThree$ = this.entityService.get('TestDataThree');
        this.observableFour$ = this.entityService.get('TestDataFour');
        this.observableFive$ = this.entityService.get('TestDataFive');
        this.observableSix$ = this.entityService.get('TestDataSix');
        this.observableSeven$ = this.entityService.get('TestDataSeven');
        this.observableEight$ = this.entityService.get('TestDataEight');
        this.observableNine$ = this.entityService.get('TestDataNine');
        this.observableTen$ = this.entityService.get('TestDataTen');
        this.observableEleven$ = this.entityService.get('TestDataEleven');
   }

    createSingleReferenceDataObservable() {
            this.referenceData$ = combineLatest([
                this.observableOne$, 
                this.observableTwo$, 
                this.observableThree$, 
                this.observableFour$, 
                this.observableFive$, 
                this.observableSix$, 
                this.observableSeven$, 
                this.observableEight$, 
                this.observableNine$, 
                this.observableTen$, 
                this.observableEleven$
            ])
            .pipe(
                map(([
                    ArrOne, 
                    ArrTwo, 
                    ArrThree, 
                    ArrFour, 
                    ArrFive, 
                    ArrSix, 
                    ArrSeven, 
                    ArrEight, 
                    ArrNine, 
                    ArrTen, 
                    ArrEleven
                ]) => {
                    return {
                        ArrOne, 
                        ArrTwo, 
                        ArrThree, 
                        ArrFour, 
                        ArrFive, 
                        ArrSix, 
                        ArrSeven, 
                        ArrEight, 
                        ArrNine, 
                        ArrTen, 
                        ArrEleven
                    }
                })
            );
        }
    
    }

The compiler is giving the following error:

Type 'Observable<{ ArrOne: ArrOne[]; ArrTwo: ArrOne[]; ArrThree:
ArrOne[]; ArrFour: ArrOne[]; ArrFive: ArrOne[]; ArrSix: ArrOne[];
ArrSeven: ArrOne[]; ArrEight: ArrOne[]; ArrNine: ArrOne[]; ArrTen:
ArrOne[]; ArrEleven: ArrOne[]; }>' is not assignable to type
'Observable'. Type '{ ArrOne: ArrOne[]; ArrTwo:
ArrOne[]; ArrThree: ArrOne[]; ArrFour: ArrOne[]; ArrFive: ArrOne[];
ArrSix: ArrOne[]; ArrSeven: ArrOne[]; ArrEight: ArrOne[]; ArrNine:
ArrOne[]; ArrTen: ArrOne[]; ArrEleven: ArrOne[]; }' is missing the
following properties from type 'ReferenceData': observableOne,
observableTwo, observableThree, observableFour, and 7 more.

It's strange because if I reduce the number of observables to six and delete the corresponding values from the ReferenceData interface, the compiler doesn't throw this error.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

(り薆情海 2025-02-20 11:09:45

RXJS CombineLatest还具有另一个超载,您可以在对象中传递,这将使您也可以跳过MAP

        this.referenceData$ = combineLatest({
            ArrOne: this.observableOne$, 
            ArrTwo: this.observableTwo$, 
            ArrThree: this.observableThree$, 
            ArrFour: this.observableFour$, 
            ArrFive: this.observableFive$, 
            ArrSix: this.observableSix$, 
            ArrSeven: this.observableSeven$, 
            ArrEight: this.observableEight$, 
            ArrNine: this.observableNine$, 
            ArrTen: this.observableTen$, 
            ArrEleven: this.observableEleven$
        });

也许这效果更好。它可能是一个数组不起作用,因为TS可能对可以从元组推断的值有限制。

RxJS combineLatest also has another overload where you can pass in an object, which would let you skip the map too:

        this.referenceData$ = combineLatest({
            ArrOne: this.observableOne$, 
            ArrTwo: this.observableTwo$, 
            ArrThree: this.observableThree$, 
            ArrFour: this.observableFour$, 
            ArrFive: this.observableFive$, 
            ArrSix: this.observableSix$, 
            ArrSeven: this.observableSeven$, 
            ArrEight: this.observableEight$, 
            ArrNine: this.observableNine$, 
            ArrTen: this.observableTen$, 
            ArrEleven: this.observableEleven$
        });

Maybe this one works better. It could be the array one doesn't work because TS might have a limit on how many values it can infer from a tuple.

梦冥 2025-02-20 11:09:45
[
                    ArrOne, 
                    ArrTwo, 
                    ArrThree, 
                    ArrFour, 
                    ArrFive, 
                    ArrSix, 
                    ArrSeven, 
                    ArrEight, 
                    ArrNine, 
                    ArrTen, 
                    ArrEleven
                ]
this is an array of type `ArrOne[] | ArrTwo[] | ArrThree[] | ArrFour[] | ArrFive[] | ArrSix[] | ArrSeven[] | ArrEight[] | ArrNine[]` and you cannot just say that `Apple | Pear` is `Apple` only the other way round.

So you need to:
    return {
                        ArrOne as ArrOne[], 
                        ArrTwo as ArrTwo[],  
                        ...
                    }
[
                    ArrOne, 
                    ArrTwo, 
                    ArrThree, 
                    ArrFour, 
                    ArrFive, 
                    ArrSix, 
                    ArrSeven, 
                    ArrEight, 
                    ArrNine, 
                    ArrTen, 
                    ArrEleven
                ]
this is an array of type `ArrOne[] | ArrTwo[] | ArrThree[] | ArrFour[] | ArrFive[] | ArrSix[] | ArrSeven[] | ArrEight[] | ArrNine[]` and you cannot just say that `Apple | Pear` is `Apple` only the other way round.

So you need to:
    return {
                        ArrOne as ArrOne[], 
                        ArrTwo as ArrTwo[],  
                        ...
                    }
天邊彩虹 2025-02-20 11:09:45

您可以在错误msg的末尾找到解决方案

缺少“参考”类型的以下属性:可观察酮,observableTwo,observablethree,observableFour等。

问题在于,在referendedata中,您将适当名称定义为observableOne,observableTwo,...

interface ReferenceData {
    observableOne: ArrOne[];
    observableTwo: ArrTwo[];
    ...
}

但是在地图中,您正在返回一个对象,其中包含属性为的属性。 arrone,arrtwo,...

因此,您要么更改映射函数,因此返回的属性名称与接口匹配。

.pipe( 
  map(([observableOne, observableTwo,...]) => 
    ({observableOne, observableTwo,...})
  )
)

的对象参数签名

this.referenceData$ = combineLatest({
  observableOne: this.observableOne$, 
  observableTwo: this.observableTwo$,
  ...
});
                    

或者您直接使用combineLatest欢呼

You can find the solution an the end of the error msg

is missing the following properties from type 'ReferenceData': observableOne, observableTwo, observableThree, observableFour, and 7 more.

The problem is that in ReferenceData you have defined the properies names as observableOne, observableTwo,...

interface ReferenceData {
    observableOne: ArrOne[];
    observableTwo: ArrTwo[];
    ...
}

But in the map you are returning an object with properties named as ArrOne, ArrTwo,...

So you either change the mapping function so the returned properties names match the interface.

.pipe( 
  map(([observableOne, observableTwo,...]) => 
    ({observableOne, observableTwo,...})
  )
)

Or you use directly the object parameter signature of combineLatest

this.referenceData$ = combineLatest({
  observableOne: this.observableOne$, 
  observableTwo: this.observableTwo$,
  ...
});
                    

Cheers

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文