{"id":21100,"date":"2018-08-02T07:00:22","date_gmt":"2018-08-02T05:00:22","guid":{"rendered":"https:\/\/www.inovex.de\/blog\/?p=13526"},"modified":"2022-11-24T10:52:34","modified_gmt":"2022-11-24T09:52:34","slug":"typescript-2-8-2-9","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/","title":{"rendered":"What&#8217;s new in TypeScript 2.8\/2.9? [State of the Web]"},"content":{"rendered":"<p>TypeScript 2.8 and 2.9 have been released with lots of new features. In this is summary I will be focusing on what I personally find handy and group it by usage. For all changes, please refer to the official release notes at the bottom of this section.<!--more--><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#Whats-new-in-TypeScript-28-and-29\" >What&#8217;s new in TypeScript 2.8 and 2.9<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#Visual-Studio-Code-IDE-features\" >Visual Studio Code IDE features<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#VS-Live-Share\" >VS Live Share<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#Unused-variables-and-imports\" >Unused variables and imports<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#Refactoring\" >Refactoring<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#Outline-view\" >Outline view<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#JSX-features-for-React-fans\" >JSX features for React fans<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#Generic-type-arguments-in-JSX-elements\" >Generic type arguments in JSX elements<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#Per-file-JSX-factories-and-JSX-namespaces\" >Per-file JSX factories and JSX namespaces<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#TypeScript-changes\" >TypeScript changes<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#number-and-symbol-named-properties-with-keyof-and-mapped-types\" >`number` and `symbol` named properties with `keyof` and mapped types<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#Conditional-Types\" >Conditional Types<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#Distributive-conditional-types\" >Distributive conditional types<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#Type-inference-in-conditional-types\" >Type inference in conditional types<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#New-Predefined-conditional-types\" >New Predefined conditional types<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#Improved-control-over-mapped-type-modifiers-and-Required-Type\" >Improved control over mapped type modifiers and Required Type<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#import-types\" >`import` types<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#JSON-Module-resolution\" >JSON Module resolution<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#%E2%80%93pretty-by-default\" >`&#8211;pretty` by default<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#References\" >References<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Whats-new-in-TypeScript-28-and-29\"><\/span>What&#8217;s new in TypeScript 2.8 and 2.9<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>This article is part of our <a href=\"https:\/\/www.inovex.de\/blog\/state-of-the-web-2018\/\" target=\"_blank\" rel=\"noopener\">State of the Web format<\/a> we publish on a regular basis. Check out our other articles about the newest tech related stuff on the web.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Visual-Studio-Code-IDE-features\"><\/span>Visual Studio Code IDE features<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"VS-Live-Share\"><\/span>VS Live Share<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>It is now possible to collaborate (pair programming) directly from within Visual Studio Code (VS Live Share Extension required). To host a session, simply log in via Microsoft or Github and initiate the Session. Then your colleague can join with the generated invite link.<\/p>\n<p>You can both work on the same codebase without your colleague having to check out any repo. Both see each other&#8217;s cursors and can edit files synchronized. Even debugging together or sharing a Terminal is possible.<\/p>\n<p>Check out the full article <a href=\"https:\/\/code.visualstudio.com\/blogs\/2017\/11\/15\/live-share\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Unused-variables-and-imports\"><\/span>Unused variables and imports<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>VS Code lets you spot unused variables and imports more easily by marking them gray. IntelliSense will also suggest to remove such variables or imports and even remove all unused statements.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Refactoring\"><\/span>Refactoring<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>When moving files, VS Code will prompt to automatically update the corresponding imports. To refactor classes and functions into a new file, mark the class or file name and VS Code will suggest to move them to a new file. This does not work for arrow functions though.<\/p>\n<p>Furthermore VS Code can now generate Getter and Setter functions for you.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Outline-view\"><\/span>Outline view<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Right-click into your explorer view and enable Outline view. While still in preview stage, it&#8217;s already quite handy for large files.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"JSX-features-for-React-fans\"><\/span>JSX features for React fans<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"Generic-type-arguments-in-JSX-elements\"><\/span>Generic type arguments in JSX elements<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>You can now pass type arguments to your generic components in JSX.<\/p>\n<p>Example:<\/p>\n<p><script async src=\"\/\/jsfiddle.net\/zhued750\/embed\/js\/\"><\/script><\/p>\n<h4><span class=\"ez-toc-section\" id=\"Per-file-JSX-factories-and-JSX-namespaces\"><\/span>Per-file JSX factories and JSX namespaces<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>It is now possible to have multiple JSX namespaces (`jsxNamespace`) and JSX factories (`@jsx` pragma). `React.createElement` is used as default.<\/p>\n<p>Example:<\/p>\n<p><script async src=\"\/\/jsfiddle.net\/1gm20hny\/embed\/js\/\"><\/script><\/p>\n<p>Generates:<\/p>\n<p><script async src=\"\/\/jsfiddle.net\/kL1cgtn0\/embed\/js\/\"><\/script><\/p>\n<h3><span class=\"ez-toc-section\" id=\"TypeScript-changes\"><\/span>TypeScript changes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"number-and-symbol-named-properties-with-keyof-and-mapped-types\"><\/span>`number` and `symbol` named properties with `keyof` and mapped types<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Previously, the operator `keyof` only supported `string` named properties. This extends now to `number` and `symbol`.<\/p>\n<p>`keyof T` for some type `T` is now a subtype of `string | number | symbol`.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Conditional-Types\"><\/span>Conditional Types<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>With conditional types you can declare a Type based on a condition expressed as a type relation test:<\/p>\n<p><script async src=\"\/\/jsfiddle.net\/khp5ym6b\/embed\/js\/\"><\/script><\/p>\n<p>This means when `T` is assignable to `U`, then the type is `X`, otherwise `Y`.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Distributive-conditional-types\"><\/span>Distributive conditional types<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Conditional types in which the checked type is a naked type parameter are called distributive conditional types. Distributive conditional types are automatically distributed over union types during instantiation.<\/p>\n<p>Example:<\/p>\n<p><script async src=\"\/\/jsfiddle.net\/vqbj2071\/embed\/js\/\"><\/script><\/p>\n<h4><span class=\"ez-toc-section\" id=\"Type-inference-in-conditional-types\"><\/span>Type inference in conditional types<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Within the `extends` clause of a conditional type, it is now possible to have `infer` declarations that introduce a type variable to be inferred. Such inferred type variables may be referenced in the true branch of the conditional type.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"New-Predefined-conditional-types\"><\/span>New Predefined conditional types<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li>`Exclude&lt;T, U&gt;` &#8212; Exclude from `T` those types that are assignable to `U`.<\/li>\n<li>`Extract&lt;T, U&gt;` &#8212; Extract from `T` those types that are assignable to `U`.<\/li>\n<li>`NonNullable` &#8212; Exclude `null` and `undefined` from `T`.<\/li>\n<li>`ReturnType` &#8212; Obtain the return type of a function type.<\/li>\n<li>`InstanceType` &#8212; Obtain the instance type of a constructor function type.<\/li>\n<\/ul>\n<h4><span class=\"ez-toc-section\" id=\"Improved-control-over-mapped-type-modifiers-and-Required-Type\"><\/span>Improved control over mapped type modifiers and Required Type<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>With the `+` and `-` operator, `readonly` and the optional `?` can be added or removed from mapped types.<\/p>\n<p>Example:<\/p>\n<p><script async src=\"\/\/jsfiddle.net\/jsvcyrb9\/embed\/js\/\"><\/script><\/p>\n<p>There is also the new type `Required` that is defined as:<\/p>\n<p><script async src=\"\/\/jsfiddle.net\/z13kaj0d\/embed\/js\/\"><\/script><\/p>\n<h4><span class=\"ez-toc-section\" id=\"import-types\"><\/span>`import` types<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>You can now use types directly without importing them first.<\/p>\n<p>Example:<\/p>\n<p><script async src=\"\/\/jsfiddle.net\/e9xkb2or\/embed\/js\/\"><\/script><\/p>\n<p><script async src=\"\/\/jsfiddle.net\/mL3k1qvc\/embed\/js\/\"><\/script><\/p>\n<h4><span class=\"ez-toc-section\" id=\"JSON-Module-resolution\"><\/span>JSON Module resolution<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Working with `.json` files was made easier with `&#8211;resolveJsonModule`. With that flag, TypeScript resolves `.json` files and automatically infers the types.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"%E2%80%93pretty-by-default\"><\/span>`&#8211;pretty` by default<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>All errors are shown in pretty by default (if the output device can display colors).<\/p>\n<h3><span class=\"ez-toc-section\" id=\"References\"><\/span>References<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>&#8211; <a href=\"https:\/\/code.visualstudio.com\/updates\/v1_24\" target=\"_blank\" rel=\"noopener\">VS Code May 2018 Updates<\/a><\/p>\n<p>&#8211; <a href=\"https:\/\/github.com\/Microsoft\/TypeScript\/wiki\/What%27s-new-in-TypeScript#typescript-28\" target=\"_blank\" rel=\"noopener\">What&#8217;s new in TypeScript 2.8<\/a><\/p>\n<p>&#8211; <a href=\"https:\/\/github.com\/Microsoft\/TypeScript\/wiki\/What%27s-new-in-TypeScript#typescript-29\" target=\"_blank\" rel=\"noopener\">What&#8217;s new in TypeScript 2.9<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>TypeScript 2.8 and 2.9 have been released with lots of new features. In this is summary I will be focusing on what I personally find handy and group it by usage. For all changes, please refer to the official release notes at the bottom of this section.<\/p>\n","protected":false},"author":262,"featured_media":13592,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[70],"service":[420],"coauthors":[{"id":262,"display_name":"Robert Merlin","user_nicename":"rmerlin"}],"class_list":["post-21100","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-web","service-apps"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>What&#039;s new in TypeScript 2.8\/2.9? [State of the Web 2018]<\/title>\n<meta name=\"description\" content=\"TypeScript 2.8 and 2.9 have been released with lots of new features. In this is summary I will be focusing on what I personally find handy and group it by usage. Let&#039;s hop right in!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"What&#039;s new in TypeScript 2.8\/2.9? [State of the Web 2018]\" \/>\n<meta property=\"og:description\" content=\"TypeScript 2.8 and 2.9 have been released with lots of new features. In this is summary I will be focusing on what I personally find handy and group it by usage. Let&#039;s hop right in!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2018-08-02T05:00:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-11-24T09:52:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/07\/TypeScript-2.8.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Robert Merlin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/07\/TypeScript-2.8-1024x576.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Robert Merlin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"3\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Robert Merlin\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/\"},\"author\":{\"name\":\"Robert Merlin\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/9d142535a61c6ec0add81973dd33ac76\"},\"headline\":\"What&#8217;s new in TypeScript 2.8\\\/2.9? [State of the Web]\",\"datePublished\":\"2018-08-02T05:00:22+00:00\",\"dateModified\":\"2022-11-24T09:52:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/\"},\"wordCount\":688,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2018\\\/07\\\/TypeScript-2.8.png\",\"keywords\":[\"Web\"],\"articleSection\":[\"Applications\",\"English Content\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/\",\"name\":\"What's new in TypeScript 2.8\\\/2.9? [State of the Web 2018]\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2018\\\/07\\\/TypeScript-2.8.png\",\"datePublished\":\"2018-08-02T05:00:22+00:00\",\"dateModified\":\"2022-11-24T09:52:34+00:00\",\"description\":\"TypeScript 2.8 and 2.9 have been released with lots of new features. In this is summary I will be focusing on what I personally find handy and group it by usage. Let's hop right in!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2018\\\/07\\\/TypeScript-2.8.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2018\\\/07\\\/TypeScript-2.8.png\",\"width\":1920,\"height\":1080,\"caption\":\"TypeScript 2.8 Globe\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/typescript-2-8-2-9\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"What&#8217;s new in TypeScript 2.8\\\/2.9? [State of the Web]\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/9d142535a61c6ec0add81973dd33ac76\",\"name\":\"Robert Merlin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/11ee242976ce1ca176ea7a2c37c2d880d7bfcc9c256a05ed1bd0683154f4ed37?s=96&d=retro&r=g1d2e0ede13962f22e06817bab97a5298\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/11ee242976ce1ca176ea7a2c37c2d880d7bfcc9c256a05ed1bd0683154f4ed37?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/11ee242976ce1ca176ea7a2c37c2d880d7bfcc9c256a05ed1bd0683154f4ed37?s=96&d=retro&r=g\",\"caption\":\"Robert Merlin\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/rmerlin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"What's new in TypeScript 2.8\/2.9? [State of the Web 2018]","description":"TypeScript 2.8 and 2.9 have been released with lots of new features. In this is summary I will be focusing on what I personally find handy and group it by usage. Let's hop right in!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/","og_locale":"de_DE","og_type":"article","og_title":"What's new in TypeScript 2.8\/2.9? [State of the Web 2018]","og_description":"TypeScript 2.8 and 2.9 have been released with lots of new features. In this is summary I will be focusing on what I personally find handy and group it by usage. Let's hop right in!","og_url":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2018-08-02T05:00:22+00:00","article_modified_time":"2022-11-24T09:52:34+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/07\/TypeScript-2.8.png","type":"image\/png"}],"author":"Robert Merlin","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/07\/TypeScript-2.8-1024x576.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Robert Merlin","Gesch\u00e4tzte Lesezeit":"3\u00a0Minuten","Written by":"Robert Merlin"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/"},"author":{"name":"Robert Merlin","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/9d142535a61c6ec0add81973dd33ac76"},"headline":"What&#8217;s new in TypeScript 2.8\/2.9? [State of the Web]","datePublished":"2018-08-02T05:00:22+00:00","dateModified":"2022-11-24T09:52:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/"},"wordCount":688,"commentCount":1,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/07\/TypeScript-2.8.png","keywords":["Web"],"articleSection":["Applications","English Content","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/","url":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/","name":"What's new in TypeScript 2.8\/2.9? [State of the Web 2018]","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/07\/TypeScript-2.8.png","datePublished":"2018-08-02T05:00:22+00:00","dateModified":"2022-11-24T09:52:34+00:00","description":"TypeScript 2.8 and 2.9 have been released with lots of new features. In this is summary I will be focusing on what I personally find handy and group it by usage. Let's hop right in!","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/07\/TypeScript-2.8.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2018\/07\/TypeScript-2.8.png","width":1920,"height":1080,"caption":"TypeScript 2.8 Globe"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/typescript-2-8-2-9\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"What&#8217;s new in TypeScript 2.8\/2.9? [State of the Web]"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/9d142535a61c6ec0add81973dd33ac76","name":"Robert Merlin","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/11ee242976ce1ca176ea7a2c37c2d880d7bfcc9c256a05ed1bd0683154f4ed37?s=96&d=retro&r=g1d2e0ede13962f22e06817bab97a5298","url":"https:\/\/secure.gravatar.com\/avatar\/11ee242976ce1ca176ea7a2c37c2d880d7bfcc9c256a05ed1bd0683154f4ed37?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/11ee242976ce1ca176ea7a2c37c2d880d7bfcc9c256a05ed1bd0683154f4ed37?s=96&d=retro&r=g","caption":"Robert Merlin"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/rmerlin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21100","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/262"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=21100"}],"version-history":[{"count":1,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21100\/revisions"}],"predecessor-version":[{"id":39561,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21100\/revisions\/39561"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/13592"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=21100"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=21100"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=21100"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=21100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}