前回型情報がなくなってcontextがunknownになる場合があることを発見した。
それをなんとかして対応する方法があるのかどうか調査する
前回
前回わかったこと
表では下記変換を実施している
Effect.Effect<never, FailMessage, never> | Effect.Effect<number, never, never>
=>
Effect.Effect<number, FailMessage, never>
| 関数名 | programの型 | defect_resultの型 | 正常動作する | 静的解析エラー |
|---|---|---|---|---|
| catch | Effect.Effect<void, never, never> | Effect.Effect<number, FailMessage, never> | Cause.Cause<Cause.UnknownException> | ⭕ | ⭕ (エラーが出ない) |
| catchAll | Effect.Effect<void, never, never> | Effect.Effect<number, FailMessage, never> | Cause.Cause<Cause.UnknownException> | ⭕ | ⭕ (エラーが出ない) |
| catchAllCause | Effect.Effect<void, Cause.NoSuchElementException, never> | Effect.Effect<number, FailMessage, never> | Cause.Cause<Cause.UnknownException> | ⭕ | ⭕ (エラーが出ない) |
| catchAllDefect | Effect.Effect<void, Cause.UnknownException, never> | Effect.Effect<number, FailMessage, never> | Cause.Cause<unknown> | ✖ | ✖ (エラーが出ない) |
| catchIf | Effect.Effect<void, Cause.UnknownException, never> | Effect.Effect<number, FailMessage, never> | Cause.Cause<Cause.UnknownException> | ⭕ | ⭕ (エラーが出ない) |
| catchSome | Effect.Effect<void, Cause.UnknownException, never> | Effect.Effect<number, FailMessage, never> | Cause.Cause<Cause.UnknownException> | ⭕ | ⭕ (エラーが出ない) |
| catchSomeCause | Effect.Effect<void, Cause.UnknownException, never> | Effect.Effect<number, FailMessage, never> | Cause.Cause<Cause.UnknownException> | ⭕ | ⭕ (エラーが出ない) |
| catchSomeDefect | Effect.Effect<void, Cause.UnknownException, never> | Effect.Effect<number, FailMessage, never> | Cause.Cause<unknown> | ✖ | ✖ (エラーが出ない) |
| catchTag | Effect.Effect<void, never, never> | Effect.Effect<number, FailMessage, never> | Cause.Cause<Cause.UnknownException> | ⭕ | ⭕ (エラーが出ない) |
| catchTags | Effect.Effect<void, never, unknown> | Effect.Effect<number, FailMessage, never> | Cause.Cause<unknown> | ⭕ | ✖ (エラーが出る) |
以下は動作しない
- catchAllDefect
- catchSomeDefect
以下は動作するが、エラーが表示される
- catchTags
catchAllDefect と catchSomeDefect を復帰させる方法はあるのか?
以下のようにすると、エラーを取得できる可能性が出てくるが、
型情報が壊れているため、その後も何度もCause.Cause<unknown>対応する必要がある
そのため、catchAllDefect と catchSomeDefect は使用しないほうがよい
const _defect_result = tryEffect.pipe(
Effect.catchAllDefect((e) => {
return Effect.cause(Effect.fail(e))
})
)
const defect_result = yield* Effect.try(() => _defect_result)
catchTags はなぜ エラーが表示されるのか?
Effect.Effect<void, never, unknown> のようにcontextが unknownだと型情報が壊れてしまった判定になる。
そのため、エラーが出てしまう。
※catchAllDefect と catchSomeDefect も同じように unknownになるべきだが、なっていない