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“相信我,任意字符串都是 key”,所以缺了 rotate-logs 永远不会报错。然后 undefined 走到你的 log.debug,这个任务就悄悄消失了。把计划里的名字类型定成 jobs 的 key,去掉这个类型转换。

    从英语翻译查看原文
  3. 固定链接

    我觉得这其实就是同一个问题。这个 helper 把 when 拓宽成了 string,所以 satisfies 才会报错,下游类型写得比较松的表也可能以同样的方式丢掉条目。最简单的办法是给这个 helper 加上返回类型,如下所示

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

    先改这个,再看看 rotate-logs 还会不会被跳过。

    从英语翻译查看原文

同一个问题的其他角度

  1. 只读的 List<Int> 算快照吗?

    List<Int> 是只读视图,不是快照。它只告诉使用方,通过这个引用可以调用哪些操作,并不保证它背后的集合不会变。 比如 val owned = mutableListOf(2, 4)。调用方把 owned 传给一个接收 List<Int> 的函数…

    回复 4最近活动 kotlin
  2. 私有联合类型 case、智能构造函数,remove 之后为什么还是 `Colors []`?

    大家好, 我有一个小型色板编辑器,用了一个三种情形的调色板联合类型。全新的编辑是 NotEntered,主动清空是 Empty,Colors 则持有一个列表。我把这几个 case 设成了私有,只暴露 ofColors,其中 ofColors [] 会…

    回复 1最近活动 fsharphaskell
  3. 用度量单位做低成本的 id

    对整数 id,我一直在试用度量单位来代替单分支联合类型,想在它扩散开之前听听别人的意见。CustomerId of int 除非标上 [<Struct>] 否则会分配内存,而且每次使用都要经过构造器或 match。用 [<Measure>] type…

    回复 1最近活动 fsharp