TypeScriptバージョン: 3.3.0-dev.201xxxxx
検索ワード:
ジェネリック医薬品の交差点
コード
let connect = <R1,R2, R = R1&R2 >(mapState2Props: (state) => R1, mapDispatch2Props: (dispatch: any) => R2): R => {
let state = {};
let dispatch = () => { };
return { ...mapState2Props(state), ...mapDispatch2Props(dispatch)}
}
予想される行動:
汎用署名でR = R1&R2
を定義したので、これは有効であると思います。
実際の動作:
returnステートメントでエラーType 'R1 & R2' is not assignable to type 'R'.
を取得します。 R extends R1&R2
も試しましたが、同じエラーが発生します。
遊び場リンク:
関連する問題:
ここでのエラーは正しいと思います。 はいR1 & R2
はデフォルトのR
に割り当てることができますが、 R
は_more_特定のタイプでインスタンス化される場合があります。 次のインスタンス化を検討してください。
connect<{ x: number; }, { y: number; }, { x: number, y: number, z: number }>( ... );
これはR1
、 R2
、およびR
有効なインスタンス化ですが、 R1 & R2
はR
割り当てられないため、割り当てられません。 z
パラメータ。
あなたの例では、 R
パラメーターは実際には必要ありません(実際のユースケースはもっと複雑かもしれませんが)。 これは機能します:
let connect = <R1,R2>(mapState2Props: (state) => R1, mapDispatch2Props: (dispatch: any) => R2): R1 & R2 => {
let state = {};
let dispatch = () => { };
return { ...mapState2Props(state), ...mapDispatch2Props(dispatch)}
}
うーん、それは良い点です。 ここでの目標は、最終的に戻り値の型R
を指定して、 mapState2Props
とmapDispatch2Props
組み合わせると有効なR
なる型の安全性を確保できる場所に到達すること
例えば:
interface IComponentProps{
foo: string;
doFoo: ()=>void
}
let props: IComponentProps = connect<IComponentProps>(
(state) => { foo: state.foo },
(dispatch) => {doFoo: () => dispatch('FOO')}
)
しかし...それが可能かどうかはわかりません...代わりにR1とR2をR
サブセットとして定義する必要があるようですが、それらは相互に依存しています...
R
も完全に無関係なタイプである可能性があることに注意してください。 ジェネリックスのデフォルトの型引数は制約ではありません。
connect<{ a: string }, { b: number }, { c: boolean[] }>(() => ({ a: "a" }), () => ({ b: 3 }))
最も参考になるコメント
ここでのエラーは正しいと思います。 はい
R1 & R2
はデフォルトのR
に割り当てることができますが、R
は_more_特定のタイプでインスタンス化される場合があります。 次のインスタンス化を検討してください。これは
R1
、R2
、およびR
有効なインスタンス化ですが、R1 & R2
はR
割り当てられないため、割り当てられません。z
パラメータ。あなたの例では、
R
パラメーターは実際には必要ありません(実際のユースケースはもっと複雑かもしれませんが)。 これは機能します: