Сценарий
Учитывая следующий объект
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)
})
}
Type '{ unicorns: (x: number) => number; }' is not assignable to type '(x: { unicorns: number; zombies: number; }) => { unicorns: number; zombies: number; } | MapPropFuncsOf<{ unicorns: number; zombies: number; }>'. Object literal may only specify known properties, and 'unicorns' does not exist in type '(x: { unicorns: number; zombies: number; }) => { unicorns: number; zombies: number; } | MapPropFuncsOf<{ unicorns: number; zombies: number; }>'






Это просто случай отсутствия (). (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]>
}
Спасибо за вашу помощь. Я все еще пытаюсь преобразовать свою реализацию в машинописный текст. MapPropFuncsOf - это размеченный союз, но я не уверен, как сказать машинописному тексту, что это функция в одном случае, а MapPropFuncsOf в другом? Ссылка на игровую площадку
(поправьте меня, если я ошибаюсь) вы хотите, чтобы функция возвращала такой объект, и эта функция была частью основного объекта. Почему? чего именно вы пытаетесь достичь?