我有一个类型,其中一个依赖另一个:
type source = string | number;
type derivative<T extends source> = T extends string ? string[] : number[];
我可以在函数参数中使用它们并获得正确的推论:
现在我要在界面中使用它们:
interface Test<T extends source> {
src: T;
handler: (dvr: derivative<T>) => void;
}
同样,我可以将其用作函数输入并获取正确的类型:
但是,如果我需要传递多个任务,则打字稿无法推断正确的类型:
是否可以解决此问题?大概是通过更改handleTestArr
函数定义。
答案 0 :(得分:2)
不幸的是,像元组类型这样的优雅解决方案在这里不起作用,打字稿将跳至number|string
而不是根据src
进行推断。
最简单的解决方案是使用元组参数(具有可选成员),并为元组的每个成员使用几个类型参数。这不是理想的选择(至少我们不必像在3.0之前的Tyepscript的旧版本中那样为每个参数定义一个重载)
function handleTestArr<
T extends source,
T1 extends source,
T2 extends source,
T3 extends source,
T4 extends source,
T5 extends source,
T6 extends source,>(ts: [Test<T>, Test<T1>?, Test<T2>?, Test<T3>?, Test<T4>?, Test<T5>?, Test<T6>?])
function handleTestArr(ts: Test<source>[]) {
}
handleTestArr([
{
src: 1,
handler: x => {}, // x is number[]
},{
src: '1',
handler: x => {}, // x is string[]
},
])