场景
给出以下对象
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 <{独角兽:数字;僵尸:数字; }>'
答案 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]>
}