Open5
type-festのIsEqualで、IsEqual<{ a:number, b:string }, { a: number } & { b: string }> = falseになる
事象
ある型Fooを書いたときに、type-festのIsEqual
を使って
type Foo = Omit<{ a: number, b: string }, 'a'> & { a: boolean }
const _proof: IsEqual<Foo, { a: boolean, b: string }> = true
を書いたら「false型の変数にtrueを代入できません」と怒られた
(つまり↑のIsEqual<...>
がfalse
になった)
解決
const _proof: IsEqual<Foo, { a: boolean } & { b: string }> = true
にしたら直った。
なぜ直ったか
Wakaran
type-festのIsEqualの定義が間違っているとは思えない
(難しい定義になっているけれど、どこかでこれは正しいという記事を読んだ)TypeScriptのジェネリクス、F<A | B>
が分配法則でF<A> | F<B>
になるように、
F<A & B>
も何かあったりする???
ちなみに
const _x: IsEqual<
{ a: number, b: string },
{ a: number } & { b: string }
> = true
も型エラーになる
Pick
型関数を使うと{ a: number } & { b: string }
のような積型を{ a: number, b: string }
に統合できるらしく、やってみた。
type A = { a: boolean } & { b: string }
type JoinedA = Pick<A, keyof A>
const _proof: IsEqual<JoinedA, { a: boolean; b: string }> = true
これは通った。
なるほど。