{"id":1946,"date":"2018-11-15T09:00:46","date_gmt":"2018-11-15T17:00:46","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/typescript\/?p=1946"},"modified":"2019-02-27T22:01:55","modified_gmt":"2019-02-28T06:01:55","slug":"announcing-typescript-3-2-rc","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-3-2-rc\/","title":{"rendered":"Announcing TypeScript 3.2 RC"},"content":{"rendered":"<p>Today we&#8217;re announcing TypeScript 3.2 RC, the release candidate of our next version of TypeScript.<\/p>\n<p>To get started using the RC, you can get it <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.TypeScript.MSBuild\" rel=\"nofollow\">through NuGet<\/a>, or use npm with the following command:<\/p>\n<pre>npm install -g typescript@rc<\/pre>\n<p>You can also get editor support for TypeScript 3.2 by:<\/p>\n<ul>\n<li><a href=\"http:\/\/download.microsoft.com\/download\/7\/0\/A\/70A6AC0E-8934-4396-A43E-445059F430EA\/3.2.0-TS-release-dev14-update3-20181113.2\/TypeScript_SDK.exe\">Downloading for Visual Studio 2017<\/a> (for version 15.2 or later)<\/li>\n<li><a href=\"http:\/\/download.microsoft.com\/download\/6\/D\/8\/6D8381B0-03C1-4BD2-AE65-30FF0A4C62DA\/3.2.0-TS-release-dev14-update3-20181113.2\/TypeScript_Dev14Full.exe\">Downloading for Visual Studio 2015<\/a> (with <a href=\"https:\/\/www.visualstudio.com\/en-us\/news\/releasenotes\/vs2015-update3-vs\" rel=\"nofollow\">Update 3<\/a>)<\/li>\n<li>Following directions for <a href=\"https:\/\/code.visualstudio.com\/Docs\/languages\/typescript#_using-newer-typescript-versions\" rel=\"nofollow\">Visual Studio Code<\/a> and <a href=\"https:\/\/github.com\/Microsoft\/TypeScript-Sublime-Plugin\/#note-using-different-versions-of-typescript\">Sublime Text<\/a>.<\/li>\n<\/ul>\n<p>We have some <a href=\"#nuget-and-vs2015-users\">important information below for NuGet users and Visual Studio 2015 users<\/a>, so please continue reading if you use either product.<\/p>\n<p>Let&#8217;s look at some of what&#8217;s coming in TypeScript 3.2!<\/p>\n<h2><code style=\"color: #a31515; font-size: 29px;\">strictBindCallApply<\/code><\/h2>\n<p>As you might&#8217;ve guessed from the title of this section, TypeScript 3.2 introduces stricter checking for <code style=\"color: #a31515;\">bind<\/code>, <code style=\"color: #a31515;\">call<\/code>, and <code style=\"color: #a31515;\">apply<\/code>. But what does that mean?<\/p>\n<p>Well in JavaScript, <code style=\"color: #a31515;\">bind<\/code>, <code style=\"color: #a31515;\">call<\/code>, and <code style=\"color: #a31515;\">apply<\/code> are methods on functions that allow us to do things like bind <code style=\"color: #a31515;\">this<\/code> and partially apply arguments, call functions with a different value for <code style=\"color: #a31515;\">this<\/code>, and call functions with an array for their arguments.<\/p>\n<p>Unfortunately, in its earlier days, TypeScript lacked the power to model these functions, and <code style=\"color: #a31515;\">bind<\/code>, <code style=\"color: #a31515;\">call<\/code>, and <code style=\"color: #a31515;\">apply<\/code> were all typed to take any number of arguments and returned <code style=\"color: #a31515;\">any<\/code>. Additionally, ES2015&#8217;s arrow functions and rest\/spread arguments gave us a new syntax that made it easier to express what some of these methods do &#8211; and in a more efficient way as well.<\/p>\n<p>Still, demand to model these patterns in a type-safe way led us to revisit this problem recently. We realized that two features opened up the right abstractions to accurately type <code style=\"color: #a31515;\">bind<\/code>, <code style=\"color: #a31515;\">call<\/code>, and <code style=\"color: #a31515;\">apply<\/code> without any hard-coding:<\/p>\n<ol>\n<li><a href=\"https:\/\/github.com\/Microsoft\/TypeScript\/pull\/6739\"><code style=\"color: #a31515;\">this<\/code> parameter types<\/a> from TypeScript 2.0<\/li>\n<li><a href=\"https:\/\/github.com\/Microsoft\/TypeScript\/pull\/24897\">Modeling parameter lists with tuple types<\/a> from TypeScript 3.0<\/li>\n<\/ol>\n<p>Combined, the two of of them can ensure our uses of <code style=\"color: #a31515;\">bind<\/code>, <code style=\"color: #a31515;\">call<\/code>, and <code style=\"color: #a31515;\">apply<\/code> are more strictly checked when we use a new flag called <code style=\"color: #a31515;\">strictBindCallApply<\/code>. When using this new flag, the methods on callable objects are described by a new global type called <code style=\"color: #a31515;\">CallableFunction<\/code> which declares stricter versions of the signatures for <code style=\"color: #a31515;\">bind<\/code>, <code style=\"color: #a31515;\">call<\/code>, and <code style=\"color: #a31515;\">apply<\/code>. Similarly, any methods on constructable (but not callable) objects are described by a new global type called <code style=\"color: #a31515;\">NewableFunction<\/code>.<\/p>\n<p>As an example, we can look at how <code style=\"color: #a31515;\">Function.prototype.apply<\/code> acts under this behavior:<\/p>\n<pre class=\"lang:default decode:true\">function foo(a: number, b: string): string {\r\n    return a + b;\r\n}\r\n\r\nlet a = foo.apply(undefined, [10]);              \/\/ error: too few argumnts\r\nlet b = foo.apply(undefined, [10, 20]);          \/\/ error: 2nd argument is a number\r\nlet c = foo.apply(undefined, [10, \"hello\", 30]); \/\/ error: too many arguments\r\nlet d = foo.apply(undefined, [10, \"hello\"]);     \/\/ okay! returns a string<\/pre>\n<p>Needless to say, whether you do any sophisticated metaprogramming, or you use simple patterns like binding methods in your class instances (<code style=\"color: #a31515;\">this.foo = this.foo.bind(this)<\/code>), this feature can help catch a lot of bugs. For more details, you can check out <a href=\"https:\/\/github.com\/Microsoft\/TypeScript\/pull\/27028\">the original pull request here<\/a>.<\/p>\n<h2>Object spread on generic types<\/h2>\n<p>JavaScript supports a handy way of copying existing properties from an existing object into a new one called &#8220;spreads&#8221;. To spread an existing object into a new object, you define an element with three consecutive periods (<code style=\"color: #a31515;\">...<\/code>) like so:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre class=\"lang:default decode:true\">let person = { name: \"Daniel\", location: \"New York City\" };\r\n\r\n\/\/ My secret revealed, I have two clones!\r\nlet shallowCopyOfPerson = { ...person };\r\nlet shallowCopyOfPersonWithDifferentLocation = { ...person, location: \"Seattle\" };<\/pre>\n<\/div>\n<p>TypeScript does a pretty good job here when it has enough information about the type. The type system closely tries to model the behavior of spreads and overwrites new properties, tries to ignore methods, etc. But unfortunately up until now it wouldn&#8217;t work with generics at all.<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre class=\"lang:default decode:true \">function merge&lt;T, U&gt;(x: T, y: U) {\r\n    \/\/ Previously an error!\r\n    return { ...x, ...y };\r\n}<\/pre>\n<\/div>\n<p>This was an error because we had no way to express the return type of <code style=\"color: #a31515;\">merge<\/code>. There was no syntax (nor semantics) that could express two unknown types being spread into a new one.<\/p>\n<p>We could have come up with a new concept in the type system called an &#8220;object spread type&#8221;, and in fact <a href=\"https:\/\/github.com\/Microsoft\/TypeScript\/issues\/10727\">we had a proposal for exactly that<\/a>. Essentially this would be a new type operator that looks like <code style=\"color: #a31515;\">{ ...T, ...U }<\/code> to reflect the syntax of an object spread.\nWhen both <code style=\"color: #a31515;\">T<\/code> and <code style=\"color: #a31515;\">U<\/code> are known, that type would flatten down to some new object type.<\/p>\n<p>However, this is pretty complex and requires adding new rules to type relationships and inference. While we explored several different avenues, we recently arrived at two conclusions:<\/p>\n<ol>\n<li>For most uses of spreads in JavaScript, users were fine modeling the behavior with intersection types (i.e. <code style=\"color: #a31515;\">Foo &amp; Bar<\/code>).<\/li>\n<li><code style=\"color: #a31515;\">Object.assign<\/code> &#8211; a function that exhibits most of the behavior of spreading objects &#8211; is already modeled using intersection types, and we&#8217;ve seen very little negative feedback around that.<\/li>\n<\/ol>\n<p>Given that intersections model the common cases, and that they&#8217;re relatively easy to reason about for both users and the type system, TypeScript 3.2 now permits object spreads on generics and models them using intersections:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre class=\"lang:default decode:true\">\/\/ Returns 'T &amp; U'\r\nfunction merge&lt;T, U&gt;(x: T, y: U) {\r\n    return { ...x, ...y };\r\n}\r\n\r\n\/\/ Returns '{ name: string, age: number, greeting: string } &amp; T'\r\nfunction foo&lt;T&gt;(obj: T) {\r\n    let person = {\r\n        name: \"Daniel\",\r\n        age: 26\r\n    };\r\n\r\n    return { ...person, greeting: \"hello\", ...obj };\r\n}<\/pre>\n<\/div>\n<h2>Object rest on generic types<\/h2>\n<p>Object rest patterns are sort of the dual of object spreads. Instead of creating a new object with some extra\/overridden properties, it creates a new object that <em>lacks<\/em> some specified properties.<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre class=\"lang:default decode:true\">let { x, y, z, ...rest } = obj;<\/pre>\n<\/div>\n<p>In the above, the most intuitive way to look at this code is that <code style=\"color: #a31515;\">rest<\/code> copies over all the properties from <code style=\"color: #a31515;\">obj<\/code> <em>apart<\/em> from <code style=\"color: #a31515;\">x<\/code>, <code style=\"color: #a31515;\">y<\/code>, and <code style=\"color: #a31515;\">z<\/code>. For the same reason as above, because we didn&#8217;t have a good way to describe the type of <code style=\"color: #a31515;\">rest<\/code> when <code style=\"color: #a31515;\">obj<\/code> is generic, we didn&#8217;t support this for a while.<\/p>\n<p>Here we also considered a new rest operator, but we saw we already had the facilities for describing the above: our <code style=\"color: #a31515;\">Pick<\/code> and <code style=\"color: #a31515;\">Exclude<\/code> helper types in <code style=\"color: #a31515;\">lib.d.ts<\/code>. To reiterate, <code style=\"color: #a31515;\">...rest<\/code> basically picks off all of the properties on <code style=\"color: #a31515;\">obj<\/code> except for <code style=\"color: #a31515;\">x<\/code>, <code style=\"color: #a31515;\">y<\/code>, and <code style=\"color: #a31515;\">z<\/code> in the following example:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre class=\"lang:default decode:true \">interface XYZ { x: any; y: any; z: any; }\r\n\r\nfunction dropXYZ&lt;T extends XYZ&gt;(obj: T) {\r\n    let { x, y, z, ...rest } = obj;\r\n    return rest;\r\n}<\/pre>\n<\/div>\n<p>If we want to consider the properties of <code style=\"color: #a31515;\">T<\/code> (i.e. <code style=\"color: #a31515;\">keyof T<\/code>) except for <code style=\"color: #a31515;\">x<\/code>, <code style=\"color: #a31515;\">y<\/code>, and <code style=\"color: #a31515;\">z<\/code>, we can write <code style=\"color: #a31515;\">Exclude&lt;keyof T, \"x\" | \"y\" | \"z\"&gt;<\/code>. We then want to pick those properties back off of the original type <code style=\"color: #a31515;\">T<\/code>, which gives us<\/p>\n<pre class=\"lang:default decode:true \">Pick&lt;T, Exclude&lt;keyof T, \"x\" | \"y\" | \"z\"&gt;&gt;`.<\/pre>\n<p>While it&#8217;s not the most beautiful type (hey, I&#8217;m no George Clooney myself), we can wrap it in a helper type like <code style=\"color: #a31515;\">DropXYZ<\/code>:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre class=\"lang:default decode:true\">interface XYZ { x: any; y: any; z: any; }\r\n\r\ntype DropXYZ&lt;T&gt; = Pick&lt;T, Exclude&lt;keyof T, keyof XYZ&gt;&gt;;\r\n\r\nfunction dropXYZ&lt;T extends XYZ&gt;(obj: T): DropXYZ&lt;T&gt; {\r\n    let { x, y, z, ...rest } = obj;\r\n    return rest;\r\n}<\/pre>\n<\/div>\n<h2>BigInt Support<\/h2>\n<p>BigInts are part of an upcoming proposal in ECMAScript that allow us to model theoretically arbitrarily large integers. TypeScript 3.2 brings type-checking for BigInts, as well as support for emitting BigInt literals when targeting <code style=\"color: #a31515;\">esnext<\/code>.<\/p>\n<p>BigInt support in TypeScript introduces a new primitive type called the <code style=\"color: #a31515;\">bigint<\/code> (all lowercase). You can get a <code style=\"color: #a31515;\">bigint<\/code> by calling the <code style=\"color: #a31515;\">BigInt()<\/code> function or by writing out a BigInt literal by adding an <code style=\"color: #a31515;\">n<\/code> to the end of any integer numeric literal:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre class=\"lang:default decode:true\">let foo: bigint = BigInt(100); \/\/ the BigInt function\r\nlet bar: bigint = 100n;        \/\/ a BigInt literal\r\n\r\n\/\/ *Slaps roof of fibonacci function*\r\n\/\/ This bad boy returns ints that are *so* big!\r\nfunction fibonacci(n: bigint) {\r\n    let result = 1n;\r\n    for (let last = 0n, i = 0n; i &lt; n; i++) {\r\n        const current = result;\r\n        result += last;\r\n        last = current;\r\n    }\r\n    return result;\r\n}\r\n\r\nfibonacci(10000n)<\/pre>\n<\/div>\n<p>While you might imagine close interaction between <code style=\"color: #a31515;\">number<\/code> and <code style=\"color: #a31515;\">bigint<\/code>, the two are separate domains.<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre class=\"lang:default decode:true\">declare let foo: number;\r\ndeclare let bar: bigint;\r\n\r\nfoo = bar; \/\/ error: Type 'bigint' is not assignable to type 'number'.\r\nbar = foo; \/\/ error: Type 'number' is not assignable to type 'bigint'.<\/pre>\n<\/div>\n<p>As specified in ECMAScript, mixing <code style=\"color: #a31515;\">number<\/code>s and <code style=\"color: #a31515;\">bigint<\/code>s in arithmetic operations is an error. You&#8217;ll have to explicitly convert values to <code style=\"color: #a31515;\">BigInt<\/code>s.<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre class=\"lang:default decode:true\">console.log(3.141592 * 10000n);     \/\/ error\r\nconsole.log(3145 * 10n);            \/\/ error\r\nconsole.log(BigInt(3145) * 10n);    \/\/ okay!<\/pre>\n<\/div>\n<p>Also important to note is that <code style=\"color: #a31515;\">bigint<\/code>s produce a new string when using the <code style=\"color: #a31515;\">typeof<\/code> operator: the string <code style=\"color: #a31515;\">\"bigint\"<\/code>. Thus, TypeScript correctly narrows using <code style=\"color: #a31515;\">typeof<\/code> as you&#8217;d expect.<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre class=\"lang:default decode:true\">function whatKindOfNumberIsIt(x: number | bigint) {\r\n    if (typeof x === \"bigint\") {\r\n        console.log(\"'x' is a bigint!\");\r\n    }\r\n    else {\r\n        console.log(\"'x' is a floating-point number\");\r\n    }\r\n}<\/pre>\n<\/div>\n<p>We&#8217;d like to extend a huge thanks to <a href=\"https:\/\/github.com\/calebsander\">Caleb Sander<\/a> for all the work on this feature. We&#8217;re grateful for the contribution, and we&#8217;re sure our users are too!<\/p>\n<h3>Caveats<\/h3>\n<p>As we mentioned, BigInt support is only available for the <code style=\"color: #a31515;\">esnext<\/code> target. It may not be obvious, but because BigInts have different behavior for mathematical operators like <code style=\"color: #a31515;\">+<\/code>, <code style=\"color: #a31515;\">-<\/code>, <code style=\"color: #a31515;\">*<\/code>, etc., providing functionality for older targets where the feature doesn&#8217;t exist (like <code style=\"color: #a31515;\">es2017<\/code> and below) would involve rewriting each of these operations. TypeScript would need to dispatch to the correct behavior depending on the type, and so every addition, string concatenation, multiplication, etc. would involve a function call.<\/p>\n<p>For that reason, we have no immediate plans to provide downleveling support. On the bright side, Node.js 11 and newer versions of Chrome already support this feature, so you&#8217;ll be able to use BigInts there when targeting <code style=\"color: #a31515;\">esnext<\/code>.<\/p>\n<p>Certain targets may include a polyfill or BigInt-like runtime object. For those purposes you may want to add <code style=\"color: #a31515;\">esnext.bigint<\/code> to the <code style=\"color: #a31515;\">lib<\/code> setting in your compiler options.<\/p>\n<h2>Breaking changes and deprecations<\/h2>\n<h3>JSX resolution changes<\/h3>\n<p>Our logic for resolving JSX invocations has been unified with our logic for resolving function calls. While this has simplified the compiler codebase and improved some use-cases, there may be some differences which we may need to reconcile. These changes are likely unintentional so they are not breaking changes <em>per se<\/em>, but upgraders should note take note of any issues they encounter and <a href=\"https:\/\/github.com\/Microsoft\/TypeScript\/issues\/new\/choose\">report them<\/a>.<\/p>\n<h3><code style=\"color: #a31515; font-size: 26px;\">lib.d.ts<\/code> changes<\/h3>\n<h4>More specific types<\/h4>\n<p>Certain parameters no longer accept <code style=\"color: #a31515;\">null<\/code>, or now accept more specific types as per the corresponding specifications that describe the DOM.<\/p>\n<h4>More platform-specific deprecations<\/h4>\n<p>Certain properties that are WebKit-specific have been deprecated. They are likely to be removed in a new version.<\/p>\n<h4><code style=\"color: #a31515;\">wheelDelta<\/code> and friends have been removed.<\/h4>\n<p><code style=\"color: #a31515;\">wheelDeltaX<\/code>, <code style=\"color: #a31515;\">wheelDelta<\/code>, and <code style=\"color: #a31515;\">wheelDeltaZ<\/code> have all been removed as they are deprecated properties on <code style=\"color: #a31515;\">WheelEvent<\/code>s.<\/p>\n<p>As a solution, you can use <code style=\"color: #a31515;\">deltaX<\/code>, <code style=\"color: #a31515;\">deltaY<\/code>, and <code style=\"color: #a31515;\">deltaZ<\/code> instead. If older runtimes are a concern, you can include a file called <code style=\"color: #a31515;\">legacy.d.ts<\/code> in your project and write the following in it:<\/p>\n<div class=\"highlight highlight-source-ts\">\n<pre class=\"lang:default decode:true  \">\/\/ legacy.d.ts\r\n\r\ninterface WheelEvent {\r\n     readonly wheelDelta: number;\r\n     readonly wheelDeltaX: number;\r\n     readonly wheelDeltaZ: number;\r\n}<\/pre>\n<\/div>\n<h2 id=\"nuget-and-vs2015-users\">A note for NuGet and Visual Studio 2015<\/h2>\n<p>We have some changes coming in TypeScript 3.2 for NuGet and VS2015 users.<\/p>\n<p>First, TypeScript 3.2 and future releases will only ship an MSBuild package, and not a standalone compiler package. Second, while our NuGet packages previously shipped with the Chakra JavaScript engine to run the compiler, the MSBuild package now depends on a globally invokable version of Node.js to be present. While machines with newer versions of Visual Studio 2017 (versions 15.8 and above) will not be impacted, testing\/CI machines, users with Visual Studio 2015, and users of Visual Studio 2017 15.7 and below will need to <a href=\"https:\/\/nodejs.org\/\">install Node.js<\/a> and will likely see a message like the following:<\/p>\n<pre><code>The build task could not find node.exe which is required to run the TypeScript compiler. Please install Node and ensure that the system path contains its location.\r\n<\/code><\/pre>\n<p>Lastly, TypeScript 3.2 will be the last TypeScript release with editor support for Visual Studio 2015 users. To stay current with TypeScript, we recommend upgrading to Visual Studio 2017 for the latest editing experience.<\/p>\n<h2>What&#8217;s next<\/h2>\n<p>We&#8217;ve actually got plenty more coming up in TypeScript 3.2, and you can track the list of major features we&#8217;ve been working <a href=\"https:\/\/github.com\/Microsoft\/TypeScript\/wiki\/Roadmap\">on our Roadmap<\/a>. We hope you give TypeScript 3.2 RC a try and give us some feedback on your experience. In the meanwhile, we&#8217;ll be listening to the community and polishing the 3.2 release over the next 2 weeks. Happy hacking!<\/p>\n<p>&#8211; Daniel Rosenwasser and the TypeScript team<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today we&#8217;re announcing TypeScript 3.2 RC, the release candidate of our next version of TypeScript. To get started using the RC, you can get it through NuGet, or use npm with the following command: npm install -g typescript@rc You can also get editor support for TypeScript 3.2 by: Downloading for Visual Studio 2017 (for version [&hellip;]<\/p>\n","protected":false},"author":381,"featured_media":1797,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1946","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-typescript"],"acf":[],"blog_post_summary":"<p>Today we&#8217;re announcing TypeScript 3.2 RC, the release candidate of our next version of TypeScript. To get started using the RC, you can get it through NuGet, or use npm with the following command: npm install -g typescript@rc You can also get editor support for TypeScript 3.2 by: Downloading for Visual Studio 2017 (for version [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/posts\/1946","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/users\/381"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/comments?post=1946"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/posts\/1946\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/media\/1797"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/media?parent=1946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/categories?post=1946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/typescript\/wp-json\/wp\/v2\/tags?post=1946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}