contentful-typescript-codegen icon indicating copy to clipboard operation
contentful-typescript-codegen copied to clipboard

Type narrowing not working with current setup

Open programm-ingovals opened this issue 3 years ago • 1 comments

Using the generated types I assume that type narrowing would work fine.

const embeddedEntry = (entry: IEntry) => {
  switch (entry.sys.contentType.sys.id) {
    case 'article':
      entry.fields // Should be known as IArticleFields here
      break
    case 'page':
      entry.fields  // Should be known as IPageFields here
}

Weirdly this does not seem to work, even though IArticleEntry should be the only one to have sys.contentType.sys.id as "article". Is it because of the generic typing?

programm-ingovals avatar Nov 28 '22 15:11 programm-ingovals

I faced the same issue and I think it's a limitation from typescript, I ended up using Type predicates to narrow down the type.

As an example you could try:

function isArticle(entry: IEntry): entry is IArticleFields {
  return entry.sys.contentType.sys.id === 'article'
}

The downside is that it doesn't work very well with switch statements.

bogdansoare avatar Feb 19 '23 10:02 bogdansoare