javascript - React Typescript - ReactNode 类型切割字符串文字
问题描述
假设我有一个带有接受字符串文字的 prop 的接口,如下所示:
interface IProps {
icon?: "success" | "warning" | "error" | "info";
...
}
然后从字典中挑选图标。假设我也想接受一个自定义图标,我会将React.ReactNode
类型添加到联合中:
interface IProps {
icon?: "success" | "warning" | "error" | "info" | React.ReactNode;
...
}
添加后,图标道具的类型仅被剪切为 React.ReactNode 并且我失去了编辑器的所有帮助(例如,将图标道具传递给组件时)。
有没有办法更好地输入它,所以输入也保留了字符串文字?
解决方案
发生这种情况的原因是这React.ReactNode
是一个包含string
. 因此,任何字符串现在都是合法的,就类型信息而言"success"
,"warning"
, 等没有什么特别之处。
我确实知道一个技巧,它会使打字稿感到困惑,以至于它继续为各个字符串提供编辑器提示。string
与其创建联合,不如创建联合(string & {})
。每个字符串都将与 匹配(string & {})
,但打字稿不会注意到 types "success"
、"warning"
等已被它淘汰。
例如:
type Example = "foo" | (string & {});
const test: Example = // when i type here, vscode gives me a hint for "foo", but any string is legal
所以要在你的情况下做同样的事情,你需要创建一个包含所有东西的联合React.ReactNode
,减号string
和加号(string & {})
。以下应该可以解决问题:
interface IProps {
icon?: "success" | "warning" | "error" | "info" | Exclude<React.ReactNode, string> | (string & {})
...
}
推荐阅读
- javascript - 从 Microsoft Graph API 请求列表项时接收空数组
- python - SQLAlchemy 不能用主键反映表
- javascript - 为什么浮点误差会根据小数的位置而变化?
- python - JSON Python MBTA API 请求
- javascript - 将点击事件添加到 Chrome 扩展程序中的按钮
- java - 如何启动 SQL Server?
- android - 添加新项目后滚动到 RecyclerView 中的第一个元素
- mysql - 如何在另一个 SQL 查询中使用 SQL 查询的结果
- javascript - 如何匹配数组中的变量并将匹配项附加一个数字并将其添加到数组中?
- julia - 如何让 Travis CI 使用 SSH 密钥:目前在访问我的私人代表时卡住了(想要用户名)