495. Звёздный навигатор

Не решаласьСложная

На заре времён, когда мир был исполнен таинственных сил, люди обнаружили, что небесные светила влияют на их жизни и судьбы. Предания повествуют о мудрецах, которые, наблюдая за звёздами, управляли потоками космической энергии, влияя таким образом на сознание и душевное равновесие людей. Разум каждой звезды был соединён с уникальными вибрациями Вселенной.

Ваша задача — воссоздать древний загадочный инструмент, который разгадывает тайны звёздного неба и подхватывает потоки космической энергии. С этим артефактом мы будем исследовать давно забытые звёздные пути и их воздействие на человеческий разум, тем самым не только повышая нашу продуктивность и творческий потенциал, но и открывая секреты бытия, неведомые до сих пор.

Условие:

Разработайте тип Get, который позволит по запросу выдавать характеристики звёзд, такие как тип светила, расстояние от Земли, координаты в космосе или другие астрономические параметры.

На входе программа должна получать константный тип массива и строку с путём в формате точечно-скобочной нотации (например, keys.(0-2).val), а возвращать — литерал значений объектов по заданному пути.

Тип должен позволить запросить информацию по определённым ключам аналогично примерам.

Примеры

Пример структуры
const celestialBody = {
    cosmicData: {
        name: 'Sirius',
        type: 'Main Sequence Star',
        discoveryDate: 'Unknown Ancient Times',
    },
    observations: [
        {
            id: 1,
            title: 'Visible Light Spectrum',
            observationType: 'Electromagnetic Spectrum',
            instrumentUsed: 'Telescope',
            spectra: [
                {
                    id: 1,
                    startWavelength: 390,
                    endWavelength: 700,
                    dataPoints: [
                        { frequency: 400 },
                        { frequency: 500 },
                        { frequency: 600 },
                    ],
                    filters: [
                        {type: 'High-Pass', cutoffWavelength: 420},
                        {type: 'Low-Pass', cutoffWavelength: 680},
                    ],
                },
            ],
            coordinates: {rightAscension: '06h 45m 08.91728s', declination: '-16° 42′ 58.0171″'},
            magnitude: 1.46,
        },
        {
            id: 2,
            title: 'Radio Frequency Detection',
            observationType: 'Radio Astronomy',
            instrumentUsed: 'Radio Telescope',
            spectra: [
                {
                    id: 2,
                    startFrequency: 300,
                    endFrequency: 900,
                    dataPoints: [
                        { frequency: 400 },
                        { frequency: 600 },
                        { frequency: 800 },
                    ],
                },
            ],
            coordinates: {rightAscension: '06h 45m 08.91728s', declination: '-16° 42′ 58.0171″'},
            magnitude: 1.12,
        },
    ],
} as const;
Примеры тестов
type celestialName = Get<typeof celestialBody, 'cosmicData.name'>; // Sirius
type firstObservationMagnitude = Get<typeof celestialBody, 'observations.0.magnitude'>; // 1.46
type observationsMagnitude = Get<typeof celestialBody, 'observations.(0-2).magnitude'>; // 1.46 | 1.12
type observationInstruments = Get<typeof celestialBody, 'observations.1.instrumentUsed'>; // "Radio Telescope"
type spectraDataPoints = Get<typeof celestialBody, 'observations.0.spectra.0.dataPoints.(0-3)'>; // { frequency: 400 } | { frequency: 500 } | { frequency: 600 }
type secondDataPointIntensity = Get<typeof celestialBody, 'observations.0.spectra.0.dataPoints.1.frequency'>; // 500

Формат ввода

Ваше решение должно содержать определение типа Get.

type Get<T extends unknown, Path extends string> = ...

Примечание

Код будет выполняться на TypeScript 4.8.4.

Ограничения

Ограничение времени

10 с

Ограничение памяти

640 МБ

JavaScript Node.js 20.14 + Chrome 125
Нужно войти, чтобы отправить решение.Войти