解决ts(2729)报错:Property 'userStatus' is used before its initialization
错误原因
TS2729报错的本质是你声明了userStatus属性为string类型但未设置初始值,就直接在初始化userStatusChanges这个BehaviorSubject时将this.userStatus当作初始参数传入,此时userStatus还未完成赋值,符合「属性在初始化前被使用」的判定规则。
修复方案
方案1:给userStatus设置初始值
最通用的解决方式,根据你的业务逻辑给userStatus设置一个合理的初始值即可:
@Injectable({ providedIn: 'root' }) export class FirebaseService { constructor(private ngZone: NgZone, private afAuth: AngularFireAuth, private firestore: AngularFirestore , private router: Router) { } public currentUser: any; // 新增初始值,可根据业务替换为'online'/'offline'/'guest'等自定义标识 public userStatus: string = 'logged-out'; public userStatusChanges: BehaviorSubject<string> = new BehaviorSubject<string>(this.userStatus); setUserStatus(userStatus: any): void { this.userStatus = userStatus; this.userStatusChanges.next(userStatus); } }
方案2:将userStatus设为可选类型
如果业务逻辑允许userStatus初始为未定义状态,可以修改属性类型兼容undefined:
@Injectable({ providedIn: 'root' }) export class FirebaseService { constructor(private ngZone: NgZone, private afAuth: AngularFireAuth, private firestore: AngularFirestore , private router: Router) { } public currentUser: any; // 加?标识为可选属性,初始值默认为undefined public userStatus?: string; // 同步修改BehaviorSubject的泛型类型 public userStatusChanges: BehaviorSubject<string | undefined> = new BehaviorSubject<string | undefined>(this.userStatus); setUserStatus(userStatus: any): void { this.userStatus = userStatus; this.userStatusChanges.next(userStatus); } }
方案3:把BehaviorSubject初始化放到构造函数中
你也可以调整初始化顺序,先给userStatus赋值后再初始化Subject:
@Injectable({ providedIn: 'root' }) export class FirebaseService { public currentUser: any; public userStatus: string; // 先声明属性暂不初始化 public userStatusChanges: BehaviorSubject<string>; constructor(private ngZone: NgZone, private afAuth: AngularFireAuth, private firestore: AngularFirestore , private router: Router) { // 先给userStatus赋值 this.userStatus = 'logged-out'; // 再初始化BehaviorSubject this.userStatusChanges = new BehaviorSubject<string>(this.userStatus); } setUserStatus(userStatus: any): void { this.userStatus = userStatus; this.userStatusChanges.next(userStatus); } }
内容的提问来源于stack exchange,提问作者adib zikri
相关产品推荐
相关产品推荐

