簡體   English   中英

測試功能參數的類型

[英]Testing type of function parameter

我有這樣的功能:

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 {};
};

是的你可以 - 使用類型斷言

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)
  };
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM