Typescript: рддреАрд╕рд░рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдореЛрдВ рдХреЗ рдЕрдВрддрд░ рдХреЛ рд╕рдорддреБрд▓реНрдп рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рдЬрдире░ 2019  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/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 рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░:

рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкрд░ Type 'R1 & R2' is not assignable to type 'R'. рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдореИрдВрдиреЗ R extends R1&R2 рднреА рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА рд╣реИред

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ:

рд╕рдВрдкрд░реНрдХ

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ:

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

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдпрд╣реАрдВ рд╣реИред рд╣рд╛рдВ R1 & R2 R рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди R рдХреЛ _more_ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

connect<{ x: number; }, { y: number; }, { x: number, y: number, z: number }>( ... );

рдпрд╣ R1 , R2 , рдФрд░ R рдХрд╛ рдПрдХ рдорд╛рдиреНрдп рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди R1 & R2 _not_ 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)}
}

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдпрд╣реАрдВ рд╣реИред рд╣рд╛рдВ R1 & R2 R рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди R рдХреЛ _more_ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

connect<{ x: number; }, { y: number; }, { x: number, y: number, z: number }>( ... );

рдпрд╣ R1 , R2 , рдФрд░ R рдХрд╛ рдПрдХ рдорд╛рдиреНрдп рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди R1 & R2 _not_ 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 }))
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

CyrusNajmabadi picture CyrusNajmabadi  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jbondc picture jbondc  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MartynasZilinskas picture MartynasZilinskas  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

blendsdk picture blendsdk  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Roam-Cooper picture Roam-Cooper  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ