objectの具体的な形にアクセスすると矛盾が生じる
Exact型がない状況下では、propertyの全取得をしたら、型と異なるものが含まれている可能性がある
参考
この記事が詳しい
これたぶん厳密に書き出すと割と多くのパターンがあると思う

↓に書いているのだけでは足りない
optional?
を使ったときや、 readonly
を使ったときなどの分岐も考えられるし
例
tsconst x = { foo: 42, bar: 'xxx' };
const y: { foo: number } = x; // 型としてはok
console.log(Object.entries(y)); // [["foo", 42], ["bar", "xxx"]]. 想定しているものと異なる
以下のようなmethodを使わない
あるいは、使用時に型が壊れる可能性に気をつける

objectのpropertyの存在判定をするもの
propertyの列挙をするもの
列挙したpropertyを利用するもの
この内、 optional?
に関係するものは、
下記の場合なら使用しても良さそう
アクセスしようとしているobjectが、 as const
で定義された実変数になっている
etc.
しかし、コードを眺めて
「ここのObject.valuesは安全だからokだけど、こっちは駄目だね」というのを、
コンパイラは教えてくれず、人間が判断しないといけないので、すごくダルいな

project全体を、fp-tsとかに統一すれば、上のようなmethodを一切使わなくても書けるようになるんじゃないかな