Typescript: Persimpangan dua parameter umum untuk membentuk yang ketiga tidak dikenali sebagai padanan

Dibuat pada 13 Jan 2019  ·  3Komentar  ·  Sumber: microsoft/TypeScript


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:

Tautan

Masalah Terkait:

https://github.com/Microsoft/TypeScript/issues/5823

Question

Komentar yang paling membantu

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)}
}

Semua 3 komentar

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 }))
Apakah halaman ini membantu?
0 / 5 - 0 peringkat