Title: Allow type annotation on catch clause variable · Issue #20024 · microsoft/TypeScript · GitHub
Open Graph Title: Allow type annotation on catch clause variable · Issue #20024 · microsoft/TypeScript
X Title: Allow type annotation on catch clause variable · Issue #20024 · microsoft/TypeScript
Description: TypeScript Version: 2.6.1 const rejected = Promise.reject(new Error()); async function tryCatch() { try { await rejected; } catch (err: Error) { // TS1196: Catch clause variable cannot have a type annotation // Typo, but `err` is `any`, ...
Open Graph Description: TypeScript Version: 2.6.1 const rejected = Promise.reject(new Error()); async function tryCatch() { try { await rejected; } catch (err: Error) { // TS1196: Catch clause variable cannot have a type ...
X Description: TypeScript Version: 2.6.1 const rejected = Promise.reject(new Error()); async function tryCatch() { try { await rejected; } catch (err: Error) { // TS1196: Catch clause variable cannot have a type ...
Opengraph URL: https://github.com/microsoft/TypeScript/issues/20024
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Allow type annotation on catch clause variable","articleBody":"**TypeScript Version:** 2.6.1\r\n\r\n```ts\r\nconst rejected = Promise.reject(new Error());\r\n\r\nasync function tryCatch() {\r\n try {\r\n await rejected;\r\n } catch (err: Error) { // TS1196: Catch clause variable cannot have a type annotation\r\n // Typo, but `err` is `any`, so it results in runtime error\r\n console.log(err.mesage.length);\r\n }\r\n}\r\n\r\nfunction promiseCatch() {\r\n rejected.catch((err: Error) =\u003e { // OK\r\n // Compiler error; Yay!\r\n console.log(err.mesage.length);\r\n });\r\n}\r\n```\r\n\r\nThis was discussed in #8677 and #10000. It was closed as \"fixed\" in #9999, but as far as I can tell neither of the issues was actually resolved. In either event, I'd like to make a case for allowing type annotations in catch clauses.\r\n\r\nEspecially with the introduction of downlevel async functions, I'd suggest that disallowing catch clause type annotations leads to less safe code. In the example, the two methods of handling the promise are functionally equivalent, but one allows you to type the error, and the other doesn't. Without writing _extra_ code for the `try`/`catch` version (`if (err instanceof Error) {` or `const e: Error = err` or something), you'll get a runtime error that you wouldn't get with the pure `Promise` version.\r\n\r\nThe primary rationale for not allowing this is that any object can be thrown, so it's not guaranteed to be correct. However, most of the benefit of TypeScript comes from making assertions about your and other people's code that can't be strictly guaranteed (especially when importing JavaScript). And unless one would argue that the `Promise` catch function _also_ shouldn't allow a type annotation on the error parameter, this argument seems to make very little practical sense.\r\n\r\nI believe one of the other arguments against is that it might be confusing, as it looks like the typed exception handling you might see in other languages (e.g., Java), and folks may think the catch will **only** catch errors of the annotated type. I don't personally believe that's a legitimate issue, but if it really is I'd propose at least allowing a `catch (err as Error) {` syntax or similar as a way of emphasizing that it's a type _assertion_.\r\n\r\nIf nothing else at all, it seems that there should be a way to trigger a warning (similar to an implicit any warning) when using an untyped `err` directly within a catch block.","author":{"url":"https://github.com/jaredru","@type":"Person","name":"jaredru"},"datePublished":"2017-11-15T01:00:46.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":83},"url":"https://github.com/20024/TypeScript/issues/20024"}
| 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:fae2050c-1404-5bfe-9357-ce72d928c6e4 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | CFD2:3618EF:5386E0:6F7D3C:6A629BF2 |
| html-safe-nonce | d3839dd33c9443b62b069b9abda2af518144b9de02dde491f87d702674ae6791 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDRkQyOjM2MThFRjo1Mzg2RTA6NkY3RDNDOjZBNjI5QkYyIiwidmlzaXRvcl9pZCI6IjY5OTk3MTc4MjQyNDk4OTU5MjMiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | f61a4f1e3b459cb28548f300a3495c4fcdd72c996eb55b2c1ba93e85321a8f20 |
| hovercard-subject-tag | issue:273998221 |
| 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/20024/issue_layout |
| twitter:image | https://opengraph.githubassets.com/315544c43de1c0157485a8fffbcda6bfafef3bc6a9539f0c66ec911115c63664/microsoft/TypeScript/issues/20024 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/315544c43de1c0157485a8fffbcda6bfafef3bc6a9539f0c66ec911115c63664/microsoft/TypeScript/issues/20024 |
| og:image:alt | TypeScript Version: 2.6.1 const rejected = Promise.reject(new Error()); async function tryCatch() { try { await rejected; } catch (err: Error) { // TS1196: Catch clause variable cannot have a type ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | jaredru |
| hostname | github.com |
| expected-hostname | github.com |
| None | a6443033349a18134b517627f043d4a59a5110337b879810c7229c2c7e28eda0 |
| 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 | d6c6cacbe32d3ddfd1796fbd1a39b8fb47b87daf |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width