假设我有一个one这样的Select
组件。为了简单起见,我们忽略了其他道具。
现在我们的Select
组件仅收到两个道具:
Select
组件会将其呈现为Option
一堆组件。我假设有两种情况。这种情况下,无需警告即可正常运行
<Select set={["peter", "tom", "jos"]} defaultValue={"tom"} />
在编辑器中应注意第二种情况,因为未设置'ben'。
<Select set={["peter", "tom", "jos"]} defaultValue={'ben'} />
我们可以在第二种情况下进行静态检查,而不是运行时检查吗?
答案 0 :(得分:2)
您可以为此类组件定义类型。它必须是通用组件,它将推断作为set
属性传入的字符串文字的类型:
function Select<T extends V[], V extends string>(p: { set: T, defaultValue: T[number] }) {
return <div></div>
}
let s = () => <Select set={["peter", "tom", "jos"]} defaultValue="tom" />
let s2 = () => <Select set={["peter", "tom", "jos"]} defaultValue="ben" /> // err
在不更改原始Select
的定义的情况下,您唯一的选择是使用辅助函数进行检查:
function Select(p: { set: string[], defaultValue: string }) {
return <div></div>
}
function SelectData<T extends V[], V extends string>(p: { set: T, defaultValue: T[number] }) : { set: string[], defaultValue: string } {
return p
}
let s = () => <Select {... SelectData({ set: ["peter", "tom", "jos"], defaultValue:"tom" })} />
let s2 = () => <Select {... SelectData({ set: ["peter", "tom", "jos"], defaultValue:"ben" })} /> // err