我正在对品牌进行映射,在不加载时,我显示每个品牌属性,在加载时,映射编号/索引数组,以及显示骨架。
在JavaScript中,它工作得很好,但TypeScript认为它会映射到编号数组上并显示品牌属性,从而显示错误:类型'number'上不存在属性'X',当它试图访问brand.icon、brand.name和brand?时?。网站。
{(loading ? Array.from(Array(6).keys()) : brands).map((brand, i, arr) => (
<Fragment key={i}>
<Accordion
TransitionProps={{
mountOnEnter: true,
unmountOnExit: true,
}}
className={classes.expPanel}
expanded={expanded === `panel${i + 1}`}
onChange={handleChange(`panel${i + 1}`)}
>
<AccordionSummary
className={classes.expPanelSummary}
expandIcon={<ExpandMore />}
aria-controls="panel1d-content"
id="panel1d-header"
>
<ListItemIcon className={classes.brandIcon}>
{loading ? renderSkeleton(28, 28, 'circle') : <Icon>{brand.icon}</Icon>}
</ListItemIcon>
{loading ? renderSkeleton() : <Typography>{brand.name}</Typography>}
</AccordionSummary>
<AccordionDetails className={classes.expPanelDetails}>
<Sites sites={brand?.sites} readOnly={readOnly} />
</AccordionDetails>
</Accordion>
{i < arr.length - 1 && <Divider />}
</Fragment>
))}
如果检查brand
是否为数字,它将缩小其类型:
{typeof brand === "number" ? renderSkeleton(28, 28, 'circle') : <Icon>{brand.icon}</Icon>}
// ^ now it's not a number