typescript - 在编译时强制指定两个道具之一?
问题描述
我有一个样式化的Button
组件。
interface Button {
href?: string;
action(): void;
}
我希望此 Button 的使用者通过(XOR)href
或action
作为道具,而不是两者。
我希望 TypeScript 在编译时强制执行此操作。
我怎样才能做到这一点?
解决方案
您可以使用联合类型来指定该类型可以具有一个道具或另一个
type Button = {
href: string;
action?: never
} | {
action: () => void;
href?: never;
}
let b1: Button = { href: "" };
let b2: Button = { action: () => { } };
let b3: Button = { action: () => { }, href: "" }; // error
您需要添加可选never
道具以确保您收到错误,这是由于过多的属性检查的工作方式,您可以在此处阅读更多信息。您也可以使用该StrictUnion
答案中的类型,但仅对于两个属性,它可能是矫枉过正。
推荐阅读
- android - 无法在 CMD 第一个 Appcelerator 项目中启动模拟器
- java - 更新后android studio中的编译错误
- php - 在不知道 Laravel 中列名的情况下获取随机模型的时间戳列值
- api - 无法使用 Java kubernetes-client 库修补 Kubernetes pod
- python - 为什么 DRF 序列化程序会返回带有必填字段的错误?
- html - 网页缓存——是否可以不缓存页面的一部分,但缓存其余部分?
- python - for 循环对迭代不会显示所有对(不重复)。我只得到列表的前两个值 - python
- google-apps-script - 不粘贴所有值的复制和粘贴脚本
- google-cloud-platform - 创建 GCP Pub/Sub 主题(如果它们可能已经存在)的最佳实践
- azure - Azure AD B2C 自定义策略中的 ClientUIFilterFlags(LineMarkers 或 MetaRefresh)是什么?