У меня сложный тип, выясняющий, как определить тип как объединение всех возможных значений из предопределенного типа объекта.
Предположим, у нас есть автоматически сгенерированный тип Person
, который выглядит следующим образом:
type Person = {
favouriteColor: string
age: number
female: boolean
}
Как использовать тип Person
для создания типа объединения, равного string | number | boolean
?
В моем случае тип Person
генерируется автоматически. Я использую функцию map Рамды для объекта, чтобы применить функцию к каждому из значений объекта:
import { map } from 'ramda'
classroom.people.forEach(person =>
// Ramda’s `map` is applied to a `block` object here:
map<Person, Person>(property => {
// The type definitions for Ramda are not sufficiently strong to infer the type
// of `property`, so it needs to be manually annotated.
return someFunction(property)
}, person)
)
Требуемое поведение по существу эквивалентно keyof
- но, насколько я знаю, в TypeScript нет valueof
. Как будет выглядеть эквивалентная реализация?
Большое спасибо!
Редактировать: Обычно решение будет таким, как предложено @ kaya3: type ValueOf<T> = T[keyof T]
. Тем не менее, при ближайшем рассмотрении моя ситуация, кажется, обеспокоена следующим:
type PersonCommonFields = {
age: number,
name: string
}
type PersonFragment =
| { favouriteColor: string }
| { female: boolean }
| { eyeColor: Color }
| { born: Date }
type Person = PersonCommonFields & PersonFragment
В этом случае ValueOf<Person>
, как определено выше, возвращает number | string
, то есть только значения из PersonCommonFields
, игнорируя PersonFragment
. Ожидаемый результат для этого примера будет number | string | boolean | Color | Date
.
Будет ли альтернативный подход к решению этой ситуации?
Большое (много!) Спасибо заранее!