我有一个服务,它使用一个初始化为1的行为主体.该值可以在1和2之间切换,以表示轮到哪个玩家.
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class PlayerTurnService {
private playerTurnState$ = new BehaviorSubject<number>(1);
nextPlayerTurn() {
this.playerTurnState$.next(this.playerTurnState$.value === 1 ? 2 : 1);
}
getCurrentPlayerTurn() {
return this.playerTurnState$.asObservable();
}
}
我正在使用属性绑定将该值赋给一个组件,该组件只是一个标签,说明哪些玩家轮流.
<app-player-label [currentPlayerTurn]="playerTurn$ | async"></app-player-label>
@Component({
selector: 'app-player-label',
template: `
<p>Player {{playerTurn}} turn </p>
`,
standalone: true,
styles: [],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class PlayerTurnLabelComponent {
@Input() playerTurn!: number;
}
但我得到了以下错误.
类型‘Number|Null’不可赋值给类型‘Numbers’.
我可以修复这个错误,但将输入设置为数字或空.
@Input() playerTurn!: number | null;
但这感觉不太对劲.特别是因为我使用了非空的断言操作符来让TypeScrip知道这个值永远不会为空.
关于行为主体如何初始化此值,我是否遗漏了什么?为什么会发生这种事?
出于演示的目的,我已经在Stackblitz中重现了这个问题.