Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Property 'commentText' does not exist on type 'Comment'

I’m building a simple social network application with Angular 12 (for my own learning).
I’m getting an error at the moment I was wondering if you can help.

Firstly about the App:

  • On the first page (home.component.html) there is a list of user profiles.
  • On clicking a list item (user profile) a userID is passed as a parameter to the ProfileComponent.
  • The ProfileComponent displays an individual user profile (along with a list of posts created by that user (similar to facebook)).
  • With this userID (that was passed in to the profile component),
    I call a method from my post.service which makes an API call to retrieve an observable with an array of Posts.

Note: Each Post object has a property called comments which is (should be) an array of Comment objects (defined in comment.model.ts).

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

The Post data is displaying well in my profile template however when I try to display properties of the comments array I get the error:

Property 'commentText' does not exist on type 'Comment'

However, If I change the comments property (in the post.model.ts) to have a type of any then there is no error and
the comments are displayed properly. However I would like to do it in right way so i’d appreciate your help/advice.

I’m new to this environment so please excuse if the error is something simple. Thanks for your help.

Here is my code:

I created two models for the posts section (so far): Comment and Post.

comment.model.ts

export class Comment {
  commentID?: number;
  commentUserID?: number;
  commentText?: string;
  commentTime?: string;
  postID?: number;
}

post.model.ts

export class Post {
  postID?: number;
  postUserID?: number;
  postText?: string;
  postTime?: string;
  photoLink?: string;
  postType?: string;
  videoLink?: string;
  isYoutubeVideo?: boolean;
  youtubeVideoCode?: string;
  youtubeEmbedLink?: any;
  comments?: Comment[]; //If I change this to any; then i don't get an error in the template
}

profile.component.ts

import { Component, OnInit } from '@angular/core';
import { UserService } from '../user.service';
import { PostService } from '../post.service';
import { ActivatedRoute, Router } from '@angular/router';
import { User } from '../user.model';
import { Comment } from '../comment.model';
import { Post } from '../post.model';

@Component({
  selector: 'app-profile',
  templateUrl: './profile.component.html',
  styleUrls: ['./profile.component.css']
})
export class ProfileComponent implements OnInit {
  currentUser: User = {
    userID: 1,
    firstName: "",
    lastName: "",
    username: "",
    profileImgUrl: "",
    bio: "",
    emailAddress: ""
  };
  posts?: Post[];

  constructor(private userService: UserService,
    private postService: PostService,
    private route: ActivatedRoute,
    private router: Router) { 
  }

  ngOnInit(): void {
    const routeParams = this.route.snapshot.paramMap;
    const userIDFromRoute = Number(routeParams.get('userID')); //cast it to a Number
    console.log(userIDFromRoute); //log the userID to make sure it is correct
    this.getCurrentUser(userIDFromRoute);
    this.getPosts(userIDFromRoute);
  }

  getPosts(userID: number): void {
    //call the getPosts(userID) method from the post service in order to retrieve
    //an array of "Post" objects for this particular user.
    //Each "Post" object will contain an array of "Comment" objects
    this.postService.getPosts(userID)
      .subscribe(
        data => {
          this.posts = data;
          console.log(data);
        },
        error => {
          console.log(error);
        });
  }
}

post.service.ts

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Comment } from './comment.model';
import { Post } from './post.model';

const httpOptions = {
  headers: new HttpHeaders({
    'Content-Type':  'application/json'
  })
};
const baseUrl = 'http://my_base_url';

@Injectable({
  providedIn: 'root'
})
export class PostService {

  constructor(private http: HttpClient) { }

  getPosts(userID: any): Observable<Post[]> {
    /*
     * This method takes in a userID as a parameter and 
     * makes a Http get request to our Random Network API
     * in order to retrieve all Posts for this user.
     * Our result will be an observable containing an array of Posts.
     */
    return this.http.get<Post[]>(`${baseUrl}/postsData/${userID}?apiKey=1234`);
  }
}

profile.component.html

<div id="posts-area">
    <ul id="list-of-posts" class="list-group">
      <li
        class="list-group-item post-list-item"
        *ngFor="let post of posts; let i = index">
        <p class="post-text-area">{{ post.postText }}</p>

        <ul id="list-of-comments" class="list-group">
          <li
            class="list-group-item comment-list-item"
            *ngFor="let comment of post.comments">
            <!--The following line is producing Error: Property 'commentText' does not exist on type 'Comment'.-->
            <p class="comment-text-area">{{ comment.commentText }}</p>

          </li>
        </ul>

      </li>
    </ul>
</div>

>Solution :

I’ve been caught out by this exact issue.

There is a built-in type called Comment. If you forget to import your own model, TypeScript defaults to the built-in type. I believe that your post.model.ts doesn’t import your custom type.

Add the import and it should all work fine 🙂

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading