Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Generic Data Typing for matter Frontmatter Parsing #168

Open
emadbaqeri opened this issue Dec 8, 2023 · 4 comments
Open

Add Generic Data Typing for matter Frontmatter Parsing #168

emadbaqeri opened this issue Dec 8, 2023 · 4 comments

Comments

@emadbaqeri
Copy link

The matter function currently returns a GrayMatterFile<string>, which loses type information about the expected data shape.

It would be better to allow passing a generic type parameter for the data property, like this:

interface PostMetadata {
  title: string;
  description: string;
}

declare function matter<T>(content: string): GrayMatterFile<string, T>;

const file = matter<PostMetadata>(`markdown string`); 

file.data.title; // typed as string

This way consumer code could get type safety when accessing the metadata.

For example in my case I'm parsing MDX files that expect title and description in the frontmatter. With generic data types I could get code completion and validation for those fields.

Potentially the GrayMatterFile type could be updated to add a second generic parameter:

interface GrayMatterFile<TContent, TData> {
  content: TContent;
  data: TData;   
  // ...
}

Please let me know your idea, and even let me know if I can do this in the current version of the lovely gray-matter.

@emadbaqeri emadbaqeri changed the title Proper TypeScript generics for GrayMatterFile<string> while trying to parse a file Add Generic Data Typing for matter Frontmatter Parsing Dec 8, 2023
@emadbaqeri
Copy link
Author

I should mention that I'm doing a type casting using as and this doesn't make me happy but it does the job.

type Content = GrayMatterFile<string> & {
  data: { title: string, description: string }
}
const content = parsedContent as Content

@ardunster
Copy link

I would enjoy a similar feature. As is, I'm just assigning a new object from my file parsing function using just the fields I expect, and returning that, but being able to specify the type on the return from matter() would be super handy.

@ardunster
Copy link

Actually, it looks like this issue has been brought up before, and has been open for a long time with no feedback from the library author. Kind of disappointing.
#135

@jrock2004
Copy link

I am trying to find where but someone posted this code snippet and its made my life easier

import matter from 'gray-matter';

const typedMatter = <T = any>(markdown: string) => {
  const rawMatter = matter(markdown);

  return {
    ...rawMatter,
    data: rawMatter.data as T,
  };
};

export default typedMatter;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants