打字稿。正确键入依赖于同一对象文字中属性的函数参数

时间:2018-09-24 11:04:38

标签: typescript

我有一个类型,其中一个依赖另一个:

type source = string | number;
type derivative<T extends source> = T extends string ? string[] : number[];

我可以在函数参数中使用它们并获得正确的推论:

enter image description here

现在我要在界面中使用它们:

interface Test<T extends source> {
    src: T;
    handler: (dvr: derivative<T>) => void;
}

同样,我可以将其用作函数输入并获取正确的类型:

enter image description here

但是,如果我需要传递多个任务,则打字稿无法推断正确的类型:

enter image description here

是否可以解决此问题?大概是通过更改handleTestArr函数定义。

Playground

1 个答案:

答案 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[]
    },

])