Title: Better typings for `connect` · Issue #160 · developit/unistore · GitHub
Open Graph Title: Better typings for `connect` · Issue #160 · developit/unistore
X Title: Better typings for `connect` · Issue #160 · developit/unistore
Description: Hey, using the current connect in typescript seems to give not as much type safety as possible. I came ob with these types/changes to make it more safe for us, as we had it more than once that we actually broke things without these types...
Open Graph Description: Hey, using the current connect in typescript seems to give not as much type safety as possible. I came ob with these types/changes to make it more safe for us, as we had it more than once that we a...
X Description: Hey, using the current connect in typescript seems to give not as much type safety as possible. I came ob with these types/changes to make it more safe for us, as we had it more than once that we a...
Opengraph URL: https://github.com/developit/unistore/issues/160
X: @github
Domain: patch-diff.githubusercontent.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Better typings for `connect`","articleBody":"Hey,\r\nusing the current `connect` in typescript seems to give not as much type safety as possible. I came ob with these types/changes to make it more safe for us, as we had it more than once that we actually broke things without these types.\r\n\r\n```javascript\r\nexport const safeConnect = \u003cT, S, K, I\u003e(\r\n pickFromState: (keyof K) \u0026 (keyof I) \u0026 string | Array\u003c(keyof K) \u0026 (keyof I) \u0026 string\u003e | StateMapper\u003cT, K, I\u003e,\r\n actions?: PropsActions\u003cI, K\u003e | Array\u003cPropsActions\u003cI, K\u003e\u003e | SafeActionCreator\u003cK, I\u003e,\r\n): ((Child: ComponentConstructor\u003cT \u0026 I, S\u003e | AnyComponent\u003cT \u0026 I, S\u003e) =\u003e ComponentConstructor\u003cT, S\u003e) =\u003e\r\n connect\u003cT, S, K, I\u003e(\r\n pickFromState,\r\n Array.isArray(actions) ? actions.reduce((prev, current) =\u003e ({ ...prev, ...current }), {}) : actions,\r\n );\r\n\r\nexport type SafeActionCreator\u003cK, I\u003e = (store: Store\u003cK\u003e) =\u003e PropsActions\u003cI, K\u003e;\r\n\r\ntype PropsActions\u003cI extends Record\u003cstring, any\u003e, K\u003e = {\r\n [P in keyof Partial\u003cI\u003e]: I[P] extends ((...args: any[]) =\u003e void)\r\n ? (s: State, ...a: Parameters\u003cI[P]\u003e) =\u003e Promise\u003cPartial\u003cK\u003e\u003e | Partial\u003cK\u003e | void\r\n : never\r\n};\r\n```\r\n\r\nThis ensures a few things, maybe an example shows that better:\r\n\r\n```javascript\r\nexport interface Store {\r\n counter: number,\r\n}\r\n\r\nexport const counterAction = {\r\n setCounter: (_: State, n: number) =\u003e ({ counter: n }),\r\n};\r\n\r\nexport interface ComponentConnectedProps {\r\n counter: number;\r\n setCounter: (count: number) =\u003e void\r\n}\r\n\r\n// usage\r\nexport const ConnectedComponent = safeConnect\u003c{}, {}, Store, ComponentConnectedProps\u003e(\r\n ['counter'], // or 'counter'\r\n [counterAction], // or counterAction\r\n)(Component);\r\n```\r\n\r\n1. `pickFromState` parameter from `safeConnect`\r\n * needs to be a key of the `Store` and the `ComponentConnectedProps`\r\n2. `actions` parameter from `safeConnect`\r\n * key of the action object needs to be in the `ComponentConnectedProps`\r\n * function parameter (without the `State`) needs to match the one in `ComponentConnectedProps`\r\n * return type of the action function needs to be `Partial` of the state\r\n\r\nThe one thing it can not ensure, is that **all** of the items from `ComponentConnectedProps` are there.\r\n\r\nIs there interest to get some version of this upstream? ","author":{"url":"https://github.com/yannick-cw","@type":"Person","name":"yannick-cw"},"datePublished":"2019-06-28T11:24:44.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/160/unistore/issues/160"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:3c9fdb4d-3846-7600-9be5-015197b2a7d6 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | A568:22D870:18F9F25:206FD1C:69908EBD |
| html-safe-nonce | 08764b2c62c27cd31151ffc2daed24b261b3ecab5de8f5bb8a0aa02d608224a3 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBNTY4OjIyRDg3MDoxOEY5RjI1OjIwNkZEMUM6Njk5MDhFQkQiLCJ2aXNpdG9yX2lkIjoiNzUxNzY5NjM1MTkyMjA2NTA4NSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 2ea571b13fe06375c371853c494088a6226c062fff426a3d8820c8afca60e677 |
| hovercard-subject-tag | issue:461988431 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/developit/unistore/160/issue_layout |
| twitter:image | https://opengraph.githubassets.com/c3fd47b0a23f07a2e18bb13a78a20801e864620a3c99e0cd3a8c9cb54718d505/developit/unistore/issues/160 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/c3fd47b0a23f07a2e18bb13a78a20801e864620a3c99e0cd3a8c9cb54718d505/developit/unistore/issues/160 |
| og:image:alt | Hey, using the current connect in typescript seems to give not as much type safety as possible. I came ob with these types/changes to make it more safe for us, as we had it more than once that we a... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | yannick-cw |
| hostname | github.com |
| expected-hostname | github.com |
| None | 42c603b9d642c4a9065a51770f75e5e27132fef0e858607f5c9cb7e422831a7b |
| turbo-cache-control | no-preview |
| go-import | github.com/developit/unistore git https://github.com/developit/unistore.git |
| octolytics-dimension-user_id | 105127 |
| octolytics-dimension-user_login | developit |
| octolytics-dimension-repository_id | 113351554 |
| octolytics-dimension-repository_nwo | developit/unistore |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 113351554 |
| octolytics-dimension-repository_network_root_nwo | developit/unistore |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 3b33c5aedc9808f45bc5fcf0b1e4404cf749dac7 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width