Basic codes to list loaded hexo posts

by default to list all posts you can using below codes:

javascript
const posts = hexo.locals.get('posts').data.map(({ title, keywords, description, raw, tags, categories, path }) => ({ title, keywords, description, raw, path, tags: tags.data.map((tag) => tag.name), categories: categories.data.map((category) => category.name) }));

Fix missing description

by default hexo not provide property description, you have to add it manually to all your Hexo Markdown posts. Or you provide the post excerpt to assign with missing description

const posts = hexo.locals.get('posts').data.map(({ description, excerpt }) => ({
  description: description || excerpt
}));

List loaded hexo posts in typescript

in typescript you should declare custom type

interface PostList {
  title: string;
  description: string;
  keywords: string[];
  tags: string[];
  categories: string[];
  permalink: string;
}
const posts = hexo.locals
  .get('posts')
  .data.map(
    ({
      title,
      keywords,
      description,
      excerpt,
      raw,
      tags,
      categories,
      path
    }) => ({
      title,
      // fix non-array keywords
      keywords: Array.isArray(keywords) ? keywords : [keywords],
      // fix missing description
      description: description || excerpt,
      raw,
      permalink: path,
      tags: tags.data.map((tag) => tag.name),
      categories: categories.data.map((category) => category.name)
    })
  ) as PostList;