Open5

type-festのIsEqualで、IsEqual<{ a:number, b:string }, { a: number } & { b: string }> = falseになる

あいや - aiya000あいや - aiya000

事象

ある型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

あいや - aiya000あいや - aiya000

TypeScriptのジェネリクス、F<A | B>が分配法則でF<A> | F<B>になるように、
F<A & B>も何かあったりする???

あいや - aiya000あいや - aiya000

ちなみに

const _x: IsEqual<
  { a: number, b: string },
  { a: number } & { b: string }
> = true

も型エラーになる

あいや - aiya000あいや - aiya000

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

これは通った。
なるほど。