Versi TypeScript: 3.3.0-dev.201xxxxx
Istilah Pencarian:
Persimpangan obat generik
Kode
let connect = <R1,R2, R = R1&R2 >(mapState2Props: (state) => R1, mapDispatch2Props: (dispatch: any) => R2): R => {
let state = {};
let dispatch = () => { };
return { ...mapState2Props(state), ...mapDispatch2Props(dispatch)}
}
Perilaku yang diharapkan:
Saya berharap ini akan valid karena saya telah mendefinisikan R = R1&R2
dalam tanda tangan generik.
Perilaku sebenarnya:
Dapatkan kesalahan Type 'R1 & R2' is not assignable to type 'R'.
pada pernyataan pengembalian. Saya juga mencoba R extends R1&R2
dan saya mendapatkan kesalahan yang sama.
Tautan Taman Bermain:
Masalah Terkait:
Saya yakin kesalahannya benar di sini. Ya R1 & R2
dapat dialihkan ke default R
, tetapi R
mungkin dipakai dengan tipe khusus _more_. Pertimbangkan contoh berikut.
connect<{ x: number; }, { y: number; }, { x: number, y: number, z: number }>( ... );
Ini adalah contoh yang valid dari R1
, R2
, dan R
, tetapi R1 & R2
adalah _not_ dapat dialihkan ke R
karena tidak ada z
parameter.
Dalam contoh Anda, parameter R
sebenarnya tidak diperlukan (meskipun kasus penggunaan Anda yang sebenarnya mungkin lebih rumit). Ini bekerja:
let connect = <R1,R2>(mapState2Props: (state) => R1, mapDispatch2Props: (dispatch: any) => R2): R1 & R2 => {
let state = {};
let dispatch = () => { };
return { ...mapState2Props(state), ...mapDispatch2Props(dispatch)}
}
hmm ya itu poin yang bagus. Tujuannya di sini adalah untuk akhirnya sampai ke tempat Anda bisa menentukan jenis pengembalian R
dan mendapatkan keamanan jenis bahwa mapState2Props
& mapDispatch2Props
digabungkan akan menghasilkan R
valid
MISALNYA:
interface IComponentProps{
foo: string;
doFoo: ()=>void
}
let props: IComponentProps = connect<IComponentProps>(
(state) => { foo: state.foo },
(dispatch) => {doFoo: () => dispatch('FOO')}
)
Namun ... Saya tidak yakin apakah itu mungkin ... Sepertinya Anda perlu mendefinisikan R1 & R2 sebagai bagian dari R
, tetapi mereka bergantung satu sama lain ...
Perhatikan bahwa R
juga bisa menjadi tipe yang sama sekali tidak berhubungan. Argumen tipe default di generik bukanlah batasan.
connect<{ a: string }, { b: number }, { c: boolean[] }>(() => ({ a: "a" }), () => ({ b: 3 }))
Komentar yang paling membantu
Saya yakin kesalahannya benar di sini. Ya
R1 & R2
dapat dialihkan ke defaultR
, tetapiR
mungkin dipakai dengan tipe khusus _more_. Pertimbangkan contoh berikut.Ini adalah contoh yang valid dari
R1
,R2
, danR
, tetapiR1 & R2
adalah _not_ dapat dialihkan keR
karena tidak adaz
parameter.Dalam contoh Anda, parameter
R
sebenarnya tidak diperlukan (meskipun kasus penggunaan Anda yang sebenarnya mungkin lebih rumit). Ini bekerja: