如何定义通用数组和合并道具?

时间:2018-11-01 08:28:35

标签: typescript

我有这样的东西

const one = { 
       props: {
              num:2
      }
}
const two ={
       props: {
            name: 'j' 
      }
}

const packages = [one,two]

现在我想创建一个由packages变量合并而成的变量,如下所示

Type CombineProps = {
    num: number
    name: string
}

使用reduce(数组),但不能在打字稿中使用

const props = package.reduce(previous, item => {...previous, ...item.props},{}) 

我该如何解决? 谢谢

1 个答案:

答案 0 :(得分:1)

在这种情况下,Typescript无法推断结果的类型。我们可以使用UnionToIntersection(不要忘记对链接的答案进行投票)和一些类型查询来构建props的交集类型:

const one = { 
    props: {
            num:2
    }
}
const two ={
    props: {
            name: 'j' 
    }
}

const packages = [one, two]

type UnionToIntersection<U> = (U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never

const props = packages
    .reduce((previous, item) => ({ ...previous, ...item.props }), {} as UnionToIntersection<typeof packages[number]['props']>)

props.name // string
props.num // number