https://qiita.com/uhyo/items/e2fdef2d3236b9bfe74a
こちらの記事の内容について質問です(執筆者の方からの回答を頂けていないので…)。
引用開始
実は同じ型変数に対するinferが複数箇所に現れることも可能です。その場合、推論される型変数にunion型やintersection型が入ることもあります。人為的な例ですが、次の例で確かめられます。
type Foo<T> = T extends { foo: infer U; bar: infer U; hoge: (arg: infer V)=> void; piyo: (arg: infer V)=> void; } ? [U, V] : never; interface Obj { foo: string; bar: number; hoge: (arg: string)=> void; piyo: (arg: number)=> void; } declare let t: Foo<Obj>; // tの型は[string | number, string & number]
部分型関係を考えれば、Uがunion型で表現されてVがintersection型で表現される理由が分かります。Uはcovariantな位置に、Vはcontravariantな位置に出現しているからです。ちなみに、試しに両方の位置に出現させてみたところ、Foo<Obj>が解決されなくなりました。
ちなみに、ReturnType<T>など、conditional typesを使った型がいくつか標準ライブラリに組み込まれるようです。自分でconditional typesと戦わなくても恩恵を得られる場面が多いと思います。
引用ここまで
「部分型関係を考えれば、Uがunion型で表現されてVがintersection型で表現される理由が分かります。Uはcovariantな位置に、Vはcontravariantな位置に出現しているからです。」この部分の意味(理由)が分からないので理由を教えて頂きたいのです。
なぜ変数の型は共変な位置で、引数の型は反変な位置になるのでしょうか。
なぜ共変な位置だとunionで、反変な位置だとintersectionになるのでしょうか。
あなたの回答
tips
プレビュー