递归类型定义

时间:2019-02-04 23:32:52

标签: typescript

场景

给出以下对象

const obj = {
  entry: 'legend',
  fauna: {
    unicorns: 10,
    zombies: 3
  },
  other: {
    hat: 2
  }
}

我正在尝试声明一个类型,该类型允许上述类型的属性的子集,但每个值必须是该值的类型到相同类型的函数

例如以下内容:

const addOne = (x:number) => x + 1

const upperCase = (x:string) => x.toUpperCase()

const mapping = {
  entry: upperCase,
  fauna: {
    unicorns: addOne
  },
  other: obj => ({
      hat: addOne(obj.hat)
  })
}

尝试

我尝试了以下定义,但嵌套属性似乎失败了

type MapPropFuncsOf<T> = {
  [P in keyof T]?: (x:T[P]) => T[P] | MapPropFuncsOf<T[P]>
}

const mapping: MapPropFuncsOf<typeof obj> = {
  entry: upperCase,
  fauna: {
    unicorns: addOne
  },
  other: obj => ({
      hat: addOne(obj.hat)
  })
}
  

键入'{unicorns:(x:number)=> number; }'无法分配给type   '(x:{独角兽:数字;僵尸:数字;})=> {独角兽:数字;   僵尸:数字; } | MapPropFuncsOf <{独角兽:数字;僵尸:   数; }>'。对象文字只能指定已知的属性,并且   '(x:{unicorns:number; zombies:   数; })=> {独角兽:数字;僵尸:数字; } |   MapPropFuncsOf <{独角兽:数字;僵尸:数字; }>'

1 个答案:

答案 0 :(得分:0)

这只是缺少()的简单情况。 (x:T[P]) => T[P] | MapPropFuncsOf<T[P]>表示返回T[P] | MapPropFuncsOf<T[P]>的函数。您可能想要一个功能(具有此签名(x:T[P]) => T[P])或MapPropFuncsOf<T[P]>

这将起作用

type MapPropFuncsOf<T> = {
  [P in keyof T]?: ((x:T[P]) => T[P]) | MapPropFuncsOf<T[P]>
}

Playground link