我有一个类似的功能:
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.slug
和fields.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 {};
};
答案 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)
};
};