openlang

satisfies ругается на хелпер, но не на джоб, который так и не запустился

Перенёс таблицу jobs с : Record<string, Job> на satisfies, чтобы when остался литералом. Теперь tsc ругается только на запись с хелпером. В воскресенье rotate-logs тихо пропустился ("nightly: 1 of 2 ran"). Это одна и та же проблема или две? (Не уверен.)

function weekly(cmd: string, timeoutSec = 600) {
  return { cmd, when: 'weekly', timeoutSec };
}

export const jobs = {
  'prune-snapshots': weekly('btrfs subvolume delete /snap/old-*'),
  // ...
} satisfies Record<string, Job>;
// plan.ts
nightly: ['backup-db', 'rotate-logs'],

// run.ts
const job = (jobs as Record<string, Job>)[name];
if (!job) { log.debug(`no job called ${name}, skipping`); continue; }
Переведено с английскогоПоказать оригинал

Разговор продолжается 4

Следуя доводам
  1. Ссылка на ответ

    Думаю, проблемы две. Хелпер возвращает when, расширенный до string, так что там нужен as const. А rotate-logs, скорее всего, просто нет в jobs, но ваш каст вместе с log.debug это прячет. Лучше бросайте там исключение.

    return { cmd, when: 'weekly' as const, timeoutSec };
    Переведено с английскогоПоказать оригинал
  2. Ссылка на ответ

    Да. Каст говорит tsc "поверь мне, любая строка — это ключ", поэтому отсутствующий rotate-logs никогда не будет ошибкой. Потом undefined попадает в ваш log.debug, и джоб просто исчезает. Типизируйте имена в плане как ключи jobs и уберите каст.

    Переведено с английскогоПоказать оригинал
  3. Ссылка на ответ

    По-моему, это всё-таки одна проблема. Хелпер расширяет when до string, поэтому satisfies и ругается, а слабо типизированная таблица дальше по цепочке точно так же может терять записи. Проще всего задать хелперу возвращаемый тип:

    function weekly(cmd: string, timeoutSec = 600): Job {
      return { cmd, when: 'weekly', timeoutSec };
    }

    Сначала поправьте это, а потом посмотрите, будет ли rotate-logs всё ещё пропускаться.

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. List<Int> только для чтения - это снимок?

    List<Int> всего лишь представление только для чтения, а не снимок. Он сообщает потребителю, какие операции доступны через эту…

    Ответы 4Последняя активность kotlin
  2. Приватные кейсы union, smart constructor, а после remove всё равно `Colors []`?

    Всем привет, У меня небольшой редактор образцов цвета с union из трёх кейсов для палитры. Свежая правка — NotEntered, намерен…

    Ответы 1Последняя активность fsharphaskell
  3. Единицы измерения как дешёвые идентификаторы

    Для целочисленных идентификаторов я пробую единицы измерения вместо объединений с одним случаем, и хочется услышать второе мн…

    Ответы 1Последняя активность fsharp