功能参数测试类型

时间:2019-07-07 11:22:31

标签: javascript typescript object ecmascript-6

我有一个类似的功能:

type Entry = PageBasic | PageHome | PostCollection | PostProduct;

export default (entry: Entry): Params => {
  const contentType = entry.sys.contentType.sys.id;

  if (contentType ==='pageBasic') {
    return { slug: entry.fields.slug };
  }

  if (contentType === 'pageCollection') {
    return { collection: entry.fields.slug };
  }

  if (contentType === 'postProduct') return {
    collection: entry.fields.collection.fields.slug,
    product: entry.fields.slug,
  };

  return {};
};

我的PageBasic,PostCollection和PostProduct类型都不同。有些包含fields.slugfields.collection数据,有些则没有。我的if语句向我确认了我要处理的条目类型,例如如果是contentType === 'pageCollection',那么我正在处理PostCollection类型。但是Typescript不知道。如果我的条件为真,是否有办法告诉我,则输入参数的类型为PostCollection或其他?

我知道的另一种方法是添加更多条件语句以检查键是否存在,当我已经知道它们将基于条件语句时,这似乎毫无意义。例如:

export default (entry: Entry): Params => {
  const contentType = entry.sys.contentType.sys.id;

  if (contentType === CT_PAGE_BASIC) {
    if ('slug' in entry.fields) return { slug: entry.fields.slug };
  }

  if (contentType === CT_POST_COLLECTION) {
    if ('slug' in entry.fields) return { collection: entry.fields.slug };
  }

  if (contentType === CT_POST_PRODUCT) return {
    ...'collection' in entry.fields && { collection: entry.fields.collection.fields.slug },
    ...'slug' in entry.fields && { product: entry.fields.slug },
  };

  return {};
};

1 个答案:

答案 0 :(得分:2)

是的,可以-使用type assertion

if (contentType ==='pageBasic') {
  return { slug: <PageBasic>(entry).fields.slug };
}

您还可以返回带有条件的对象:

export default (entry: Entry): Params => {
  const contentType = entry.sys.contentType.sys.id;
  return { 
    ...(contentType ==='pageBasic' ? { slug: (<PageBasic>entry).fields.slug } : 0),
    ...(contentType === 'pageCollection' ? { collection: (<PostCollection>entry).fields.slug } : 0),
    ...(contentType === 'postProduct' ? { collection: (<PostProduct>entry).fields.collection.fields.slug, product: (<PostProduct>entry).fields.slug } : 0)
  };
};