![](/img/trans.png)
[英]Passing a function as a prop to a Typescript React Functional Component
[英]Typescript prop discrimination in react functional component
我正在創建一個動態小部件,它可以是空的也可以是已填充的。 它應該默認為空。 當populated={true}
時,我希望需要totalGross
和totalNet
值。 否則,不應允許使用這兩個道具。
為此,我正在嘗試使用區分類型( WidgetBodyProps
)。 然而,TypeScript 抱怨因為totalNet
和totalGross
是<WidgetBodyPopulated />
中必需的道具
type WidgetBodyProps =
| { isEmpty?: false; totalNet: string; totalGross: string }
| { isEmpty: true; totalNet?: never; totalGross?: never };
type WidgetProps = WidgetHeaderProps & WidgetBodyProps;
const Widget = (props: WidgetProps) => {
const { title = "", isEmpty = true, totalNet, totalGross } = props;
return (
<Card>
<Box>
<WidgetHeader title={title} />
<Divider my="4" />
{isEmpty ? (
<WidgetBodyEmpty flex="1" />
) : (
<WidgetBodyPopulated totalNet={totalNet} totalGross={totalGross} />
)}
</Box>
</Card>
);
};
一旦你解構了道具,Typescript 就會忘記它們曾經是相關的。 因此,對一個變量的測試不會區分另一個變量的類型。 但是在你解構props
的時候你還沒有測試它的類型,所以所有的變量都是以所有的可能性被類型化的。
但是,如果你避免解構,那么 Typescript 可以密切關注props
的類型。 通過這種方式測試道具的屬性可以縮小您期望的道具類型。
{props.isEmpty ? (
<WidgetBodyEmpty flex="1" />
) : (
<WidgetBodyPopulated
totalNet={props.totalNet}
totalGross={props.totalGross}
/>
)}
然后你甚至可以將這些道具簡化為:
type WidgetBodyProps =
| { isEmpty?: false; totalNet: string; totalGross: string }
| { isEmpty: true };
因為您永遠不會在不先檢查.isEmpty
的情況下訪問.totalNet
。
通常發生此錯誤是因為 Typescript 不相信您某些東西不是 null。使用非空斷言運算符告訴 Typescript 它可以相信您知道自己在做什么,並且您不會向它提供 null。另一種選擇是確保相關變量正確設置為空字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.