TypeScript报错TS2339:类型'{}'不存在属性'confirmed'求助
解决TS2339:类型'{}'不存在属性'confirmed'的问题
嘿,这个错误我之前在Angular+Firestore项目里也踩过坑!本质是TypeScript的静态类型检查在“较真”——它没办法确定你的Firestore文档数据里包含confirmed这个属性,虽然运行时数据能正常展示,但编译时通不过类型校验。咱们一步步搞定它:
1. 补全数据的类型定义
你用到的MycollectionDoc接口大概率没包含confirmed字段,TypeScript自然会认为这个属性不存在。赶紧把它加上,而且用可选符?标记,刚好匹配你“存在就展示、不存在就跳过”的需求:
interface MycollectionDoc { // 保留你已有的其他字段,比如id、用户名之类的 id?: string; username?: string; // 新增这个可选字段 confirmed?: boolean; }
2. 替换偷懒的any为强类型
你现在用的dataCollection: any;和activatedUsers: any[];相当于给TypeScript开了“免检通道”,反而容易埋下类型隐患。换成咱们刚完善的接口类型:
dataCollection: AngularFirestoreCollection<MycollectionDoc>; data: Observable<MycollectionDoc[]>; activatedUsers: MycollectionDoc[];
3. 调整数据获取时的类型映射
在ngOnInit里获取Firestore集合的时候,明确指定类型并映射数据,让TypeScript清楚知道每个文档的结构:
ngOnInit() { this.activatedUsers = []; // 明确指定集合的类型为MycollectionDoc this.dataCollection = this.afs.collection<MycollectionDoc>('mycollection'); // 快照订阅时严格映射类型 this.data = this.dataCollection.snapshotChanges().pipe( map(actions => actions.map(a => { // 把文档数据断言为MycollectionDoc类型 const docData = a.payload.doc.data() as MycollectionDoc; const id = a.payload.doc.id; return { id, ...docData }; })) ); // 筛选有confirmed字段的用户时,类型检查就不会报错了 this.data.subscribe(docs => { this.activatedUsers = docs.filter(doc => doc.confirmed); }); }
4. 模板里加个安全防护(可选但推荐)
即使TS层面搞定了,模板里用安全导航操作符?.能避免运行时潜在的空值问题,比如:
<div *ngFor="let user of activatedUsers"> <!-- 用*ngIf判断confirmed存在,同时用?.做安全访问 --> <p *ngIf="user?.confirmed">{{ user.username }}</p> </div>
为啥原来会报错?
之前的代码要么是MycollectionDoc没定义confirmed字段,要么是用了any导致TypeScript无法推断数据结构,当你访问doc.confirmed时,它默认把数据当成了空对象{},自然会抛出“属性不存在”的错误啦。
内容的提问来源于stack exchange,提问作者G B
相关产品推荐
相关产品推荐

