Title: [Suggestion] Mapped types with inner generic arguments and constraints · Issue #17375 · microsoft/TypeScript · GitHub
Open Graph Title: [Suggestion] Mapped types with inner generic arguments and constraints · Issue #17375 · microsoft/TypeScript
X Title: [Suggestion] Mapped types with inner generic arguments and constraints · Issue #17375 · microsoft/TypeScript
Description: Proposal I'd like to suggest a feature where in mapped types we could unwrap some of the properties. I'm trying to solve a problem where I want to unpromise a type, and this requires access to the inner generic argument type. This is use...
Open Graph Description: Proposal I'd like to suggest a feature where in mapped types we could unwrap some of the properties. I'm trying to solve a problem where I want to unpromise a type, and this requires access to the ...
X Description: Proposal I'd like to suggest a feature where in mapped types we could unwrap some of the properties. I'm trying to solve a problem where I want to unpromise a type, and this requires access...
Opengraph URL: https://github.com/microsoft/TypeScript/issues/17375
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[Suggestion] Mapped types with inner generic arguments and constraints","articleBody":"# Proposal\r\nI'd like to suggest a feature where in mapped types we could unwrap some of the properties. I'm trying to solve a problem where I want to **unpromise** a type, and this requires access to the inner generic argument type. This is useful in creating redux style reducers that are strongly typed.\r\n\r\n## Example\r\n```ts\r\n//i'd like access to the inner generic arguments, without having to pass TPayload\r\ntype Unpromise\u003cTPayload, TPromise extend Promise\u003cTPayload\u003e\u003e = TPayload;\r\n\r\n//and then use that also as a type guard for mapped types\r\ntype Reducer\u003cTActions\u003e = {\r\n [K in keyof TActions where TActions[K] extends Promise\u003cany\u003e]: (payload: Unpromise\u003cTActions[K]\u003e)=\u003evoid;\r\n [K in keyof TActions where TActions[K] !extends Promise\u003cany\u003e]: (payload: TActions[K] )=\u003evoid;\r\n}\r\n```\r\n### Complete Example\r\n```ts\r\n//redux style actions class\r\nclass Actions{\r\n get(): Promise\u003cstring\u003e;\r\n}\r\n//redux style reducer\r\nclass MyReducer{\r\n get(payload:string){...}\r\n}\r\n\r\n//unpromise type\r\ntype Unpromise\u003cTPayload, TPromise extend Promise\u003cTPayload\u003e\u003e = TPayload;\r\n\r\n//example derived usage with generic constraints\r\ntype Reducer\u003cTActions\u003e = {\r\n [K in keyof TActions where TActions[K] extends Promise\u003cany\u003e]: (payload: Unpromise\u003cTActions[K]\u003e)=\u003evoid;\r\n [K in keyof TActions where TActions[K] !extends Promise\u003cany\u003e]: (payload: TActions[K] )=\u003evoid;\r\n}\r\n\r\n//redux style reducer wireup\r\nfunction handleActions\u003cTActions\u003e(actions: TActions, reducer: Reducer\u003cTActions\u003e){\r\n...\r\n}\r\n\r\n//this would check that MyReducer has methods similar to Actions taking in the resolved promise payload as an argument\r\nhandleActions(new Actions(), new MyReducer());\r\n```\r\n\r\nrelated to #12424 ","author":{"url":"https://github.com/richardspence","@type":"Person","name":"richardspence"},"datePublished":"2017-07-24T19:13:51.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/17375/TypeScript/issues/17375"}
| 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:af8595f7-b73c-e97c-c1d9-c91a1bfdc938 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | A0C2:1B3B59:DCE093:12984E2:6A62B55C |
| html-safe-nonce | b943684a9c07f5525965bd5123a61be320cd7dbbe3b97f7fc246e5ee9af98b34 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBMEMyOjFCM0I1OTpEQ0UwOTM6MTI5ODRFMjo2QTYyQjU1QyIsInZpc2l0b3JfaWQiOiI5MTYyNTUyNDAyNjI1MzQ0ODYwIiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | 525d6e7ed1935378790b0b15306c731ae1e9e72a76921a1b8fb45de9197c74ae |
| hovercard-subject-tag | issue:245180477 |
| 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/microsoft/TypeScript/17375/issue_layout |
| twitter:image | https://opengraph.githubassets.com/e760b9a05b2ce6353718d96abd43b34a2831190c94692a5f09dd49d1164e11e0/microsoft/TypeScript/issues/17375 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/e760b9a05b2ce6353718d96abd43b34a2831190c94692a5f09dd49d1164e11e0/microsoft/TypeScript/issues/17375 |
| og:image:alt | Proposal I'd like to suggest a feature where in mapped types we could unwrap some of the properties. I'm trying to solve a problem where I want to unpromise a type, and this requires access to the ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | richardspence |
| hostname | github.com |
| expected-hostname | github.com |
| None | 2738d7125e864b55224a8bc40c72c220ca7d2c73f91a7bb8d69dffe9d35e997d |
| turbo-cache-control | no-preview |
| go-import | github.com/microsoft/TypeScript git https://github.com/microsoft/TypeScript.git |
| octolytics-dimension-user_id | 6154722 |
| octolytics-dimension-user_login | microsoft |
| octolytics-dimension-repository_id | 20929025 |
| octolytics-dimension-repository_nwo | microsoft/TypeScript |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 20929025 |
| octolytics-dimension-repository_network_root_nwo | microsoft/TypeScript |
| 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 | bf54af498459157b66a67136f992a68752cdbb54 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width