Definitelytyped: react-redux์˜ 'connect'๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: ์œ ํ˜• "'void' ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"

์— ๋งŒ๋“  2016๋…„ 07์›” 04์ผ  ยท  32์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: DefinitelyTyped/DefinitelyTyped

react-redux์˜ connect ๋ฅผ ํด๋ž˜์Šค ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด Type 'foo' is not assignable to type 'void' ํ˜•์‹์˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํƒ€์ดํ•‘์˜ ๋ฌธ์ œ๋Š” TypeScript๊ฐ€ ClassDecorator ์žฅ์‹ํ•˜๋Š” ๊ฒƒ์˜ ์„œ๋ช…์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ด๊ฒƒ์ด ํ˜„์žฌ react-redux ํƒ€์ดํ•‘์˜ ๊ตฌํ˜„์ด๋ฉฐ ์˜๋„์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— react-redux๋Š” props์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์„œ๋ช…์„ ๊ฐ€์ง„ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค .

connect ๋ฅผ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ˜•์‹ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ์„œ์˜ ์‚ฌ์šฉ๋ฒ•๋ฟ์ž…๋‹ˆ๋‹ค.

์ œ์•ˆ์€ ํ™˜์˜ํ•˜์ง€๋งŒ ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์€ ํ˜„์žฌ ํƒ€์ดํ•‘์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ๊ฐœ์„ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ฌ๊ฐํ•œ ํšŒ๊ท€ ๋ฐ ๋ถ€๋ถ„์ ์œผ๋กœ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ "์‹คํ—˜์ "์œผ๋กœ ๊ฐ„์ฃผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ‘œ์ค€ ๊ธฐ๋Šฅ ์‚ฌ์šฉ์— ๋ถ€์ฐจ์ ์ธ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

https://github.com/Microsoft/TypeScript/issues/4881 ์ด ๋›ฐ์–ด๋‚œ ๋™์•ˆ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ž…๋ ฅ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์†”๋ฃจ์…˜์ด ๊ฐ€๋Šฅํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฆ‰, (์ฒซ ๋ฒˆ์งธ ํŒจ์Šค) ๋ชจ๋“  ์ข…๋ฅ˜์˜ React.ComponentClass ๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ์ตœ์†Œํ•œ ์ปดํŒŒ์ผ๋˜๋„๋ก ํ•œ ๋‹ค์Œ (๋‘ ๋ฒˆ์งธ ํŒจ์Šค) ๋ชจ๋“  props(์†Œ์œ  ๋ฐ ์—ฐ๊ฒฐ), ๋„ˆ๋ฌด ๊ด€๋Œ€ํ• ์ง€๋ผ๋„ ์ฝ”๋“œ ์œ ํ˜•์€ ์ ์–ด๋„ ์ผ๋ถ€ props๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ง€๊ธˆ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์œ ์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ connect ๋ฅผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์Šคํƒ€์ผ์ƒ ๋ณด๊ธฐ ํ‰ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์œ ํ˜• ํ™•์ธํ•˜๊ณ  ๋” ๊ธธ์ง€ ์•Š์œผ๋ฉฐ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์‹ ์—:

@connect(mapStateToProps, mapDispatchToProps)
class MyComponent extends React.Component<...> { ... }

(๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„) ์‚ฌ์šฉํ•˜๋‹ค:

class MyComponentImpl extends React.Component<...> { ... }
const MyComponent = connect(mapStateToProps, mapDispatchToProps)(MyComponentImpl);

https://github.com/DefinitelyTyped/DefinitelyTyped/issues/8787 ์ด ์—ฌ๊ธฐ์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ๋•Œ๋•Œ๋กœ ์ด ๋ฌธ์ œ์™€ ํ˜ผ๋™๋ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ ๊ตฌ์„ฑ ์š”์†Œ์— ์ ์ ˆํ•œ ์œ ํ˜•์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜• ํžŒํŠธ ๋˜๋Š” ์บ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: https://github.com/Microsoft/TypeScript/pull/12114 ์ด ๊ฒฝ์šฐ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์ƒ์„ฑ๋œ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋ชจ๋“  ์„ ํƒ์  ๋ฒ„์ „์˜ ์†Œํ’ˆ์„ ์ƒ์„ฑํ•˜๋„๋ก ์ž ์žฌ์ ์œผ๋กœ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์™„์ „ํžˆ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณ„์†ํ•ด์„œ prop nullity์— ๋Œ€ํ•ด ๋” ์ ๊ทน์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@connect ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ ค๋ฉด(์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ ) ๋‹ค์Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@(connect(mapStateToProps, mapDispatchToProps) as any)
class MyComponent extends React.Component<...> {...}

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋ชจ๋“  ํƒ€์ดํ•‘์ด ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” @seansfkelley์˜ ๋ง์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค...

๋ชจ๋“  32 ๋Œ“๊ธ€

๋‚˜๋Š” ์š”์ „์— ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ์—ฐ๊ฒฐ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ๋–จ์–ด ๋œจ ๋ ธ์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์€ ๋ฌด์‹œํ•˜๊ณ  ์ด์ „ ๋ฐ˜์‘ ์œ ํ˜•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  PR์„ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก ์ด์•ผ! ์ด๋Ÿฌํ•œ ์œ ํ˜•์ด ์›๋ž˜ ์ž‘์„ฑ๋œ ์ดํ›„๋กœ ๋งŽ์€ ๊ฒƒ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ, ์žฅ์‹์ž ์ง€์›์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์œ ์šฉํ•œ ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „์— ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๋ถ€์ ์ ˆํ•จ์„ ํ•ด๊ฒฐํ•œ ์ ์ด ์žˆ์œผ๋ฏ€๋กœ ์‹œ๋„ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

์•„๋งˆ๋„ ๋งคํ•‘๋œ ์œ ํ˜•์ด ์ผ๋ถ€๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ถœ๋ ฅ์— ์ตœ์†Œํ•œ _์ผ๋ถ€_ ์œ ์šฉํ•œ ์œ ํ˜• ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์šœ๋กœ

export function myConnect(mapStateToProps, mapDispatchToProps) {
    return function (target) {
        return <any>connect(mapStateToProps, mapDispatchToProps)(target);
    }
}

๋‚˜๋Š” ์ด๊ฒƒ์„ yolo-typing์— ๋Œ€ํ•œ ๋งŽ์€ ์š”์ ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋‚˜์—ด๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๊ณผ #8787, ํŠนํžˆ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํŠนํžˆ ๊ตฌ์„ฑ ์š”์†Œ ํด๋ž˜์Šค์šฉ IDE ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ). ๋ชจ๋“  ์œ ํ˜•์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. :( ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋Œ€์‹  ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ฌด ์ž…๋ ฅ์ด๋‚˜ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์นดํŠธ๋ฅผ ๋ง ์•ž์— ๋‘๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@connect ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ ค๋ฉด(์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ ) ๋‹ค์Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@(connect(mapStateToProps, mapDispatchToProps) as any)
class MyComponent extends React.Component<...> {...}

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋ชจ๋“  ํƒ€์ดํ•‘์ด ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” @seansfkelley์˜ ๋ง์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค...

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ตฌ๋ฌธ์ด ํ›Œ๋ฅญํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ‘œ์ค€ ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐ๊ณผ ๊ฐ™์€ HOC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

1) ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์‚ฌ์–‘์— ์–ด๊ธ‹๋‚˜๋Š” ํด๋ž˜์Šค์˜ ์œ ํ˜•์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
2) Connect๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ HOC์ž…๋‹ˆ๋‹ค.
3) stateless ๋ฐ stateful ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ์˜ ์ด์‹์„ฑ์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž˜๋ชป๋œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •์˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

@npirotte ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. HOC๋ฅผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์‚ฌ์–‘์„ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ด์ƒ ๊ธฐ๋ณธ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  TS์—์„œ ์ง€์› ์ƒํƒœ๋ฅผ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์•„์ง ํ”Œ๋ž˜๊ทธ ๋’ค์— ์žˆ๊ณ  AFAICS์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹ค). ์ง€์›์„ ์ค‘๋‹จํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์„. ๋˜ํ•œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์—ฌ์ „ํžˆ w3c ์ดˆ์•ˆ์ž…๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒˆ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ _์žฅ์‹_ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋Œ€์‹  ๊ณ ์ฐจ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ•ด๋„ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ์€ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

const { connect } = require('react-redux');

@connect(mapStateToProps, mapDispatchToProps)
class MyComponent extends React.Component<...> { ... }

require ์ž…๋ ฅํ•œ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” @TriStarGod . ์ด ๊ฒฝ์šฐ connect ๋ฅผ any ๋กœ ์ž…๋ ฅํ•˜๊ฒŒ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์†”๋ฃจ์…˜/ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•.

์ด๋ฏธ ์ž์ฒด ์•ฑ ์ƒํƒœ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋งค์šฐ ์งง์€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

export interface PageProps {
    routing: RouterState;
}

export interface PageDispatch {
    navigate: () => void
}

@connect<PageProps, PageDispatch>(
    state => ({
        routing: state.routing
    }),
    dispatch => ({
        navigate: () => dispatch(push("/"))
    })
)
export class Page extends React.Component<PageProps & PageDispatch> {
...
}

๋‹ค์Œ์€ ๋ž˜ํ•‘๋œ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

import { connect } from "react-redux";
import { ApplicationState } from './rootReducer';

interface MapPropsParam<TProps>{
    (state: ApplicationState, ownProps?: TProps): TProps
}

interface MapDispatchParam<TProps, TDispatchProps>{
   (dispatch: Redux.Dispatch<ApplicationState>, ownProps?: TProps): TDispatchProps;
}

export interface ConnectedComponent<TProps> {
    <TComponent extends React.ComponentType<TProps>>(component: TComponent): TComponent;
}

function connectToAppState<TProps, TDispatchProps = {}>(mapProps: MapPropsParam<TProps>, mapDispatch?: MapDispatchParam<TProps, TDispatchProps>) : ConnectedComponent<TProps> {
    return connect<TProps, TDispatchProps, TProps>(mapProps, mapDispatch) as ConnectedComponent<TProps & TDispatchProps>;    
}

export {
    connectToAppState as connect
}

๊ท€ํ•˜์˜ ์ž‘์—…์— ๋Œ€ํ•œ Thx. ๊ตฌ๋…ํ•˜๊ณ  ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ง„ํ–‰์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@offbeatful mapDispatchToProps ์˜ ๋‹ค๋ฅธ ๋ณ€ํ˜•์— ๋Œ€ํ•œ ์œ ํ˜• ์„ ์–ธ์„ ์ œ๊ณตํ•˜์„ธ์š”.

๊ฐ์ฒด๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด ๋‚ด๋ถ€์˜ ๊ฐ ํ•จ์ˆ˜๋Š” Redux ์ž‘์—… ์ƒ์„ฑ์ž๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„์ด ๊ฐ™์ง€๋งŒ ๋ชจ๋“  ์ž‘์—… ์ƒ์„ฑ์ž๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๋„๋ก ๋””์ŠคํŒจ์น˜ ํ˜ธ์ถœ๋กœ ๋ž˜ํ•‘๋œ ๊ฐœ์ฒด๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ์†Œํ’ˆ์œผ๋กœ ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

@offbeatful ์ฃผ์„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

myConnect.ts

import {
    connect as originalConnect, MapDispatchToPropsParam, MapStateToPropsParam, MergeProps, Options
} from "react-redux";
import * as React from "react";

export interface InferableComponentEnhancerWithProps<TInjectedProps, TNeedsProps> {
    <TComponent extends React.ComponentType<TInjectedProps & TNeedsProps>>(component: TComponent): TComponent;
}

interface MyConnect {
    <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}>(
        mapStateToProps?: MapStateToPropsParam<TStateProps, TOwnProps>,
        mapDispatchToProps?: MapDispatchToPropsParam<TDispatchProps, TOwnProps>
    ): InferableComponentEnhancerWithProps<TStateProps & TDispatchProps, TOwnProps>;

    <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, TMergedProps = {}>(
        mapStateToProps?: MapStateToPropsParam<TStateProps, TOwnProps>,
        mapDispatchToProps?: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
        mergeProps?: MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps>,
        options?: Options<TStateProps, TOwnProps, TMergedProps>
    ): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps>;

}

export const connect = originalConnect as MyConnect;

@pravdomil ์Šค๋‹ˆํŽซ ๋ฐ ์ตœ์‹  ์œ ํ˜•(5.0.13)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์—…๋ฐ์ดํŠธ๋จ

import { ApplicationState } from "./rootReducer";

import * as React from "react";
import {
    connect as originalConnect, MapDispatchToPropsParam, MapStateToPropsParam, MergeProps, Options
} from "react-redux";

export type InferableComponentEnhancerWithProps<TInjectedProps, TNeedsProps> = <TComponent extends React.ComponentType<TInjectedProps & TNeedsProps>>(component: TComponent) => TComponent;

interface MyConnect {
    <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}>(
        mapStateToProps?: MapStateToPropsParam<TStateProps, TOwnProps, ApplicationState>,
        mapDispatchToProps?: MapDispatchToPropsParam<TDispatchProps, TOwnProps>
    ): InferableComponentEnhancerWithProps<TStateProps & TDispatchProps, TOwnProps>;

    <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, TMergedProps = {}>(
        mapStateToProps?: MapStateToPropsParam<TStateProps, TOwnProps, ApplicationState>,
        mapDispatchToProps?: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
        mergeProps?: MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps>,
        options?: Options<TStateProps, TOwnProps, TMergedProps>
    ): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps>;

}

export const connect = originalConnect as MyConnect;

์•ˆ๋…•ํ•˜์„ธ์š” @offbeatful (cc: @pravdomil ์ถ”์ธก์ธ๊ฐ€์š”?), ์ตœ๊ทผ์— ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ๋œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ์งˆ๋ฌธ ์„ ํ–ˆ๋Š”๋ฐ ์ด๊ฒƒ์ด ํ˜„์žฌ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒฐ๋ก ์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค . ๊ทธ ์งˆ๋ฌธ์˜ ์ผ๋ถ€๋กœ ๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ๊ฒƒ์„ ๋ณด์—ฌ์ค„ ์ €์žฅ์†Œ ๋ฅผ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ˜„์žฌ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒฐ๋ก ์ด ๋‚ฌ์œผ๋ฏ€๋กœ ์˜ค๋Š˜ ๊ท€ํ•˜์˜ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ๋ณด๊ณ  ๊ธฐ๋ปค๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋‚ด ์ €์žฅ์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ฝ”๋“œ ์กฐ๊ฐ์ด ํ†ตํ•ฉ๋œ ์ปค๋ฐ‹์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋” ์ด์ƒ ์ด์ „์— ์–ป์—ˆ๋˜ ์˜ค๋ฅ˜๋กœ ์†Œ๋ฆฌ ์ง€๋ฅด์ง€ ์•Š์ง€๋งŒ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€๋งŒ ์ž์ฒด props๊ฐ€ ์žˆ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ด ์ƒˆ๋กœ์šด ์„œ๋ช…์€ ์ด์ œ state props๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•„์š”ํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ž์‹ ์˜ (TSX) ์†Œํ’ˆ. ๋‚ด ์ €์žฅ์†Œ์˜ cd my-app && yarn start ๋Š” ๋‚ด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ๋ณด์—ฌ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์ด connect ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

connect(
        mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
        mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
        mergeProps: null | undefined,
        options: Options<State, TStateProps, TOwnProps>
): InferableComponentEnhancerWithProps<TStateProps & TDispatchProps, TOwnProps>

๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด, ๋‹น์‹ ์€ ๋‹จ์ง€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ options ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ๋  Options<any, any, any> ๋‹น์‹ ์€ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค ์ด๋Ÿฐ ์‹์œผ๋กœ TStateProps & TDispatchProps ๊ฐ€ ๋  ๊ฒƒ ์‚ฌ์ดŒ ๋ฌธ์ œ๋ฅผ TStateProps & any

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ:

const options = { withRef:true } as Options<any, any, any>;
export const Component = connect(mapStateToProps, mapDispatchToProps, null, options)

๋‹น์‹ ์ฒ˜๋Ÿผ ๋ฉ‹์ง„

@TomasHubelbauer ๊ธฐ๋ณธ redux ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ์•„
์ด์ƒํ•˜๊ฒŒ ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ธ ๊ฐ€์ง€ ์œ ํ˜• ๊ฐ„์— ๊ณต์œ  ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

export type CounterStateProps = {
    count: number;
};

export type CounterDispatchProps = {
    onIncrement: () => void;
};

export type CounterOwnProps = {
    initialCount: number;
};

export type CounterProps = CounterStateProps & CounterDispatchProps & CounterOwnProps;

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒํƒœ ์ €์žฅ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.

export class StatefulCounter extends React.Component<CounterProps, CounterStateProps> {
    timer: number;

    componentDidMount() {
        this.timer = setInterval(this.props.onIncrement, 5000);
    }

    componentWillUnmount() {
        clearInterval(this.timer);
    }

    render() {
      return (
        <StatelessCounter count={this.props.count}/>
      );
    }
}

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ์—ฐ๊ฒฐ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์—ฐ๊ฒฐ์—์„œ redux์˜ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋„ฅํ„ฐ ํด๋ž˜์Šค๋ฅผ ์ด์™€ ๊ฐ™์ด ๋งŒ๋“ญ๋‹ˆ๋‹ค.

const mapStateToProps =
    (state: RootState, ownProps: CounterOwnProps): CounterStateProps => ({
        count: countersSelectors.getReduxCounter(state) + ownProps.initialCount,
    });

const mapDispatchToProps =
    (dispatch: Dispatch<CounterActionType>): CounterDispatchProps => bindActionCreators({
        onIncrement: CounterActions.increment,
    }, dispatch);

export const ConnectedCounter =
    connect(mapStateToProps, mapDispatchToProps)(StatefulCounter);

@JohnHandley ์˜ˆ, ์ €๋Š” ์ด๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค . ์ œ ์˜ˆ ์—์„œ๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์„ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋น„ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ณ€ํ˜•์„ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋„ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋‚˜๋Š” ๋‹น์‹ ์ด ์‚ฌ์šฉํ•˜๋Š”, ๋‹น์‹ ์ด ๋‹น์‹ ์˜ ์œ ํ˜•์„ ํ˜ผํ•ฉ ์ƒ๊ฐ CounterStateProps ์˜ ๋ฆฌํ„ด ํƒ€์ž… ์ธ ( mapDispatchToProps ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋กœ CounterProps (๊ดœ์ฐฎ ์ธ์ด ๋Œ์•„ ์˜ค๋Š” ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  props, Redux ๋””์ŠคํŒจ์น˜ props ๋ฐ JSX ์ž์ฒด props)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌ์„ฑ ์š”์†Œ ์ƒํƒœ์— ๋Œ€ํ•œ ์œ ํ˜•์œผ๋กœ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.๋Œ€์‹  state ์—๋Š” ์™ธ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์œ ํ˜• ์„œ๋ช…๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ์ž์ฒด ์œ ํ˜•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ TSX์—์„œ Redux ์ƒํƒœ ์†Œํ’ˆ์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ๋‚ด ์ €์žฅ์†Œ(TSX์—์„œ ์ž์ฒด props์™€ Redux ์ƒํƒœ props์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ)์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด , ๊ทธ๊ฒƒ๋„ ์ข‹์„๊ฑฐ์•ผ!

์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด +1

@offbeatful ์—์„œ ์Šค๋‹ˆํŽซ์„ ์—…๋ฐ์ดํŠธํ–ˆ์œผ๋ฉฐ ์ง€๊ธˆ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

connect.ts ( IAppState ๋Š” redux ์ƒํƒœ์˜ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค)

import React from 'react'
import {
    connect as originalConnect,
    MapDispatchToPropsParam,
    MapStateToPropsParam,
    MergeProps,
    Options,
} from 'react-redux'


export type InferableComponentEnhancerWithProps<IInjectedProps, INeedsProps> =
    <IComponent extends React.ComponentType<IInjectedProps & INeedsProps>>(component: IComponent) => IComponent

export interface IConnect {
    <IStateProps = {}, IDispatchProps = {}, IOwnProps = {}>(
        mapStateToProps?: MapStateToPropsParam<IStateProps, IOwnProps, IAppState>,
        mapDispatchToProps?: MapDispatchToPropsParam<IDispatchProps, IOwnProps>,
    ): InferableComponentEnhancerWithProps<IStateProps & IDispatchProps, IOwnProps>

    <IStateProps = {}, IDispatchProps = {}, IOwnProps = {}, IMergedProps = {}>(
        mapStateToProps?: MapStateToPropsParam<IStateProps, IOwnProps, IAppState>,
        mapDispatchToProps?: MapDispatchToPropsParam<IDispatchProps, IOwnProps>,
        mergeProps?: MergeProps<IStateProps, IDispatchProps, IOwnProps, IMergedProps>,
        options?: Options<IStateProps, IOwnProps, IMergedProps>,
    ): InferableComponentEnhancerWithProps<IMergedProps, IOwnProps>

}

export const connect = originalConnect as IConnect

๊ทธ๋Ÿฐ ๋‹ค์Œ ์—ฐ๊ฒฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import {connect} from 'path-to-my-connect/connect'

interface IOwnProps {
    ... props exposed for the real parent component
}

interface IStateProps {
    ... props from mapStateToProps
}

interface IDispatchProps {
    ... props from mapDispatchToProps
}

interface IProps extends IStateProps, IDispatchProps, IOwnProps {}

@connect<IStateProps, IDispatchProps, IOwnProps>(
    (state: IAppState) => {
            return {
                foo: getFoo(state), // getFoo is a selector using 'reselect'
            }
        },
    {setFoo, increment, decrement, ... your action creators},
)
class MyComponent extends React.PureComponent<IProps> {
        // your component implementation
}

export default (MyComponent as any) as React.ComponentType<IOwnProps>

MyComponent as React.ComponentType<IOwnProps> ์ง์ ‘ ์บ์ŠคํŒ…์€ ์‹คํŒจํ•˜๋ฏ€๋กœ ๋จผ์ € any ๋กœ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•ดํ‚น์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋ถ€๋ชจ์™€ ๊ตฌ์„ฑ ์š”์†Œ ์ž์ฒด์—๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฐ€์žฅ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ œํ•œ์ ์ธ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

"react-redux": "^5.0.6",
"typescript": "^2.8.1",
"@types/react-redux": "^6.0.0",

์–ด๋–ค ์†Œ์‹?

@ctretyak ์•„๋‹ˆ์š” , ๊ฒฐ๊ตญ ์ง์ ‘ ์„ ์–ธ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. React Eco์™€ TS๋Š” ๊ฐ€์žฅ ์นœํ•œ ์นœ๊ตฌ๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฐ€ ์—ฌ๊ธฐ๋กœ ๋„˜์–ด๊ฐ„ ์ด์œ ์ž…๋‹ˆ๋‹ค.

const DecoratedComponent = require('../DecoratedComponent').default;

์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด IDE์—์„œ ์†Œํ’ˆ์„ ํ‘œ์‹œํ•˜๊ณ  ts ์˜ค๋ฅ˜๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ๋ชป์ƒ๊ฒผ์ง€๋งŒ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ๋‹จ์ˆœํ•œ ์—ฐ๊ฒฐ๋ณด๋‹ค ๋” ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฒˆ์—ญ ๋˜๋Š” ํƒ์ƒ‰๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์„ ํƒ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ

react-redux ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. @withRouter (React-Router์—์„œ) ๋ฐ @graphql๊ณผ ๋™์ผํ•œ ์˜๊ฒฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Typescript๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์†Œํ’ˆ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

Typescript๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์†Œํ’ˆ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

ํ— ์ด๊ฒŒ ์•„์ง๋„ ๋ฌธ์ œ์•ผ? ๋ฐฉ๊ธˆ ์ด๊ฒƒ์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค.

๋ฌด์–ธ๊ฐ€๊ฐ€ ์šฐ๋ฆฌ์˜ ๋‘๋‡Œ๋ฅผ ํŒŒ๊ดดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์Šฌํ”„์ง€๋งŒ, ์šฐ๋ฆฌ๋ฅผ ๋” ํŽธ์•ˆํ•˜๊ฒŒ ํ•ด์ฃผ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค :(

๋ฌด์–ธ๊ฐ€๊ฐ€ ์šฐ๋ฆฌ์˜ ๋‘๋‡Œ๋ฅผ ํŒŒ๊ดดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์Šฌํ”„์ง€๋งŒ, ์šฐ๋ฆฌ๋ฅผ ๋” ํŽธ์•ˆํ•˜๊ฒŒ ํ•ด์ฃผ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค :(

์ €๋„ ์š” :(

์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ์ง€๋Š” ์•Š์ง€๋งŒ ์ €์—๊ฒŒ ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ํ•œ ๊ณณ์—์„œ ๋‚ด ์Šคํ† ์–ด ์œ ํ˜•(MyAppStore)์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

export function connectTs<TDispatchProps={}, TOwnProps=any>(
  mapStateToProps?: (state: MyAppStore, ownProps?: TOwnProps) => any,
  mapDispatchToProps?: MapDispatchToPropsParam<TDispatchProps, TOwnProps>
): any {
  return connect(mapStateToProps, mapDispatchToProps)
}

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

connect๋ฅผ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ๋„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ณต์‹ ์†”๋ฃจ์…˜์ด ์ œ๊ณต๋˜๋‚˜์š”???
๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ connect(mapStateToProps,mapDispatchToProps)(components)๋ณด๋‹ค @connect ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰