繁体   English   中英

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

[英]Typescript. Correctly typing function parameter that depends on property in the same object literal

我有一个类型,其中一个取决于另一个:

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函数定义。

操场

不幸的是,像元组类型这样的优雅解决方案在这里不起作用,打字稿将跳至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[]
    },

])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM