Skip to content

Commit ce8d8ac

Browse files
committed
deploy: 24a5d4f
1 parent c6c3653 commit ce8d8ac

File tree

1 file changed

+37
-2
lines changed

1 file changed

+37
-2
lines changed

docs/typescript/features.html

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
107107
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>const</span><span class=mtk1> </span><span class=mtk6>_exhaustiveCheck</span><span class=mtk8>:</span><span class=mtk1> </span><span class=mtk8>never</span><span class=mtk1> </span><span class=mtk8>=</span><span class=mtk1> command;</span></span></span>
108108
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>return</span><span class=mtk1> _exhaustiveCheck;</span></span></span>
109109
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> }</span></span></span>
110-
<span class=grvsc-line><span class=grvsc-source><span class=mtk1>}</span></span></span></code></pre><h2 id=tagged-unions>Tagged Unions<a href=#tagged-unions aria-hidden=true tabindex=-1><span class=anchor>#</span></a></h2><p class="is-info is-medium tag">Added in v4.1.3<p>Even if F# unions can be used in a typed-safe manner from TypeScript, when you build a public API you may want your unions to feel more "native".<p>Fable can compile F# unions to TypeScript tagged unions thanks to the <code>TypeScriptTaggedUnion</code> attribute. You define the name of the tag property in the attribute, and the name of each case will become the value of the tag. It is also important that you use named fields for each case.<pre class="atom-one-light grvsc-container"data-index=9 data-language=fs><code class=grvsc-code><span class=grvsc-line><span class=grvsc-source><span class=mtk8>[&#60TypeScriptTaggedUnion</span><span class=mtk14>(</span><span class=mtk10>"type"</span><span class=mtk14>)</span><span class=mtk8>>]</span></span></span>
110+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1>}</span></span></span></code></pre><h2 id=tagged-unions>Tagged Unions<a href=#tagged-unions aria-hidden=true tabindex=-1><span class=anchor>#</span></a></h2><p class="is-info is-medium tag">Added in v4.1.3<h3 id=discriminated-unions>Discriminated Unions<a href=#discriminated-unions aria-hidden=true tabindex=-1><span class=anchor>#</span></a></h3><p>Even if F# unions can be used in a typed-safe manner from TypeScript, when you build a public API you may want your unions to feel more "native".<p>Fable can compile F# unions to TypeScript tagged unions thanks to the <code>TypeScriptTaggedUnion</code> attribute. You define the name of the tag property in the attribute, and the name of each case will become the value of the tag. It is also important that you use named fields for each case.<pre class="atom-one-light grvsc-container"data-index=9 data-language=fs><code class=grvsc-code><span class=grvsc-line><span class=grvsc-source><span class=mtk8>[&#60TypeScriptTaggedUnion</span><span class=mtk14>(</span><span class=mtk10>"type"</span><span class=mtk14>)</span><span class=mtk8>>]</span></span></span>
111111
<span class=grvsc-line><span class=grvsc-source><span class=mtk14>type</span><span class=mtk1> </span><span class=mtk4>Command</span><span class=mtk1> </span><span class=mtk14>=</span></span></span>
112112
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>|</span><span class=mtk1> Take </span><span class=mtk14>of</span><span class=mtk1> fromIndex</span><span class=mtk14>:</span><span class=mtk1> </span><span class=mtk4>int</span><span class=mtk1> </span><span class=mtk14>*</span><span class=mtk1> toIndex</span><span class=mtk14>:</span><span class=mtk1> </span><span class=mtk4>int</span></span></span>
113113
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>|</span><span class=mtk1> Edit </span><span class=mtk14>of</span><span class=mtk1> text</span><span class=mtk14>:</span><span class=mtk1> </span><span class=mtk4>string</span></span></span>
@@ -126,4 +126,39 @@
126126
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class="mtk7 mtki">// No additional data</span></span></span>
127127
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>break</span><span class=mtk1>;</span></span></span>
128128
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> }</span></span></span>
129-
<span class=grvsc-line><span class=grvsc-source><span class=mtk1>}</span></span></span></code></pre><p>type Circle = abstract kind: string abstract radius: float<p>type Square = abstract kind: string abstract sideLength: float<p>[&#60TypeScriptTaggedUnion("kind")>] type Shape = | Circle of Circle | Square of Square<p>// usage let describeShape (shape: Shape) = match shape with | Circle c -> $"circle of radius {c.radius}" | Square s -> $"square of length {s.sideLength}"</div></div></section><div class="section bd-docs-pagination bd-pagination-links"><a class="button bd-fat-button is-primary is-light bd-pagination-prev" href="/docs/typescript/build-and-run.html"><i></i><span class="is-hidden-mobile"><em>TypeScript</em><strong>Build and Run</strong></span></a><a class="button bd-fat-button is-primary is-light bd-pagination-next" href="/docs/typescript/compatibility.html"><span class="is-hidden-mobile"><em>TypeScript</em><strong>.NET and F# compatibility</strong></span><i></i></a></div></div></div></div></div><script async="" src="/resources/nacara-standard-layouts/scripts/menu.js"></script></body></html>
129+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1>}</span></span></span></code></pre><h3 id=interfaces>Interfaces<a href=#interfaces aria-hidden=true tabindex=-1><span class=anchor>#</span></a></h3><p>It is also possible to use interfaces instead for describing tagged unions.<p>This allows to use interfaces in the F# code to access the fields instead of tuple destructuring.<pre class="atom-one-light grvsc-container"data-index=12 data-language=fs><code class=grvsc-code><span class=grvsc-line><span class=grvsc-source><span class=mtk14>type</span><span class=mtk1> </span><span class=mtk4>Take</span><span class=mtk1> </span><span class=mtk14>=</span></span></span>
130+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>abstract</span><span class=mtk1> fromIndex</span><span class=mtk14>:</span><span class=mtk1> </span><span class=mtk4>int</span></span></span>
131+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>abstract</span><span class=mtk1> toIndex</span><span class=mtk14>:</span><span class=mtk1> </span><span class=mtk4>int</span></span></span>
132+
<span class=grvsc-line><span class=grvsc-source></span></span>
133+
<span class=grvsc-line><span class=grvsc-source><span class=mtk14>type</span><span class=mtk1> </span><span class=mtk4>Edit</span><span class=mtk1> </span><span class=mtk14>=</span></span></span>
134+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>abstract</span><span class=mtk1> text</span><span class=mtk14>:</span><span class=mtk1> </span><span class=mtk4>string</span></span></span>
135+
<span class=grvsc-line><span class=grvsc-source></span></span>
136+
<span class=grvsc-line><span class=grvsc-source><span class=mtk8>[&#60TypeScriptTaggedUnion</span><span class=mtk14>(</span><span class=mtk10>"type"</span><span class=mtk14>)</span><span class=mtk8>>]</span></span></span>
137+
<span class=grvsc-line><span class=grvsc-source><span class=mtk14>type</span><span class=mtk1> </span><span class=mtk4>Command</span><span class=mtk1> </span><span class=mtk14>=</span></span></span>
138+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>|</span><span class=mtk1> Take </span><span class=mtk14>of</span><span class=mtk1> </span><span class=mtk4>Take</span></span></span>
139+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>|</span><span class=mtk1> Edit </span><span class=mtk14>of</span><span class=mtk1> </span><span class=mtk4>Edit</span></span></span>
140+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>|</span><span class=mtk1> Save</span></span></span></code></pre><p>In TypeScript it becomes:<pre class="atom-one-light grvsc-container"data-index=13 data-language=ts><code class=grvsc-code><span class=grvsc-line><span class=grvsc-source><span class=mtk14>export</span><span class=mtk1> </span><span class=mtk14>interface</span><span class=mtk1> </span><span class=mtk4>Take</span><span class=mtk1> {</span></span></span>
141+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> fromIndex</span><span class=mtk8>:</span><span class=mtk1> </span><span class=mtk4>int32</span><span class=mtk1>,</span></span></span>
142+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> toIndex</span><span class=mtk8>:</span><span class=mtk1> </span><span class=mtk4>int32</span></span></span>
143+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1>}</span></span></span>
144+
<span class=grvsc-line><span class=grvsc-source></span></span>
145+
<span class=grvsc-line><span class=grvsc-source><span class=mtk14>export</span><span class=mtk1> </span><span class=mtk14>interface</span><span class=mtk1> </span><span class=mtk4>Edit</span><span class=mtk1> {</span></span></span>
146+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> text</span><span class=mtk8>:</span><span class=mtk1> </span><span class=mtk8>string</span></span></span>
147+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1>}</span></span></span>
148+
<span class=grvsc-line><span class=grvsc-source></span></span>
149+
<span class=grvsc-line><span class=grvsc-source><span class=mtk14>export</span><span class=mtk1> </span><span class=mtk14>type</span><span class=mtk1> </span><span class=mtk4>Command</span><span class=mtk1> </span><span class=mtk8>=</span><span class=mtk1> </span></span></span>
150+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk8>|</span><span class=mtk1> </span><span class=mtk4>Take</span><span class=mtk1> </span><span class=mtk8>&amp</span><span class=mtk1> { type</span><span class=mtk8>:</span><span class=mtk1> </span><span class=mtk10>"take"</span><span class=mtk1> }</span></span></span>
151+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk8>|</span><span class=mtk1> </span><span class=mtk4>Edit</span><span class=mtk1> </span><span class=mtk8>&amp</span><span class=mtk1> { type</span><span class=mtk8>:</span><span class=mtk1> </span><span class=mtk10>"edit"</span><span class=mtk1> }</span></span></span>
152+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk8>|</span><span class=mtk1> { type</span><span class=mtk8>:</span><span class=mtk1> </span><span class=mtk10>"save"</span><span class=mtk1> }</span></span></span></code></pre><p>TypeScript consumer code can now use the union in a natural way:<pre class="atom-one-light grvsc-container"data-index=14 data-language=ts><code class=grvsc-code><span class=grvsc-line><span class=grvsc-source><span class=mtk14>function</span><span class=mtk1> </span><span class=mtk9>execute</span><span class=mtk1>(command</span><span class=mtk8>:</span><span class=mtk1> </span><span class=mtk4>Command</span><span class=mtk1>) {</span></span></span>
153+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>switch</span><span class=mtk1> (command.</span><span class=mtk5>type</span><span class=mtk1>) {</span></span></span>
154+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>case</span><span class=mtk1> </span><span class=mtk10>"take"</span><span class=mtk1>:</span></span></span>
155+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class="mtk7 mtki">// command.fromIndex and command.toIndex are available</span></span></span>
156+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>break</span><span class=mtk1>;</span></span></span>
157+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>case</span><span class=mtk1> </span><span class=mtk10>"edit"</span><span class=mtk1>:</span></span></span>
158+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class="mtk7 mtki">// command.text is available</span></span></span>
159+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>break</span><span class=mtk1>;</span></span></span>
160+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>case</span><span class=mtk1> </span><span class=mtk10>"save"</span><span class=mtk1>:</span></span></span>
161+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class="mtk7 mtki">// No additional data</span></span></span>
162+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> </span><span class=mtk14>break</span><span class=mtk1>;</span></span></span>
163+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1> }</span></span></span>
164+
<span class=grvsc-line><span class=grvsc-source><span class=mtk1>}</span></span></span></code></pre></div></div></section><div class="section bd-docs-pagination bd-pagination-links"><a class="button bd-fat-button is-primary is-light bd-pagination-prev" href="/docs/typescript/build-and-run.html"><i></i><span class="is-hidden-mobile"><em>TypeScript</em><strong>Build and Run</strong></span></a><a class="button bd-fat-button is-primary is-light bd-pagination-next" href="/docs/typescript/compatibility.html"><span class="is-hidden-mobile"><em>TypeScript</em><strong>.NET and F# compatibility</strong></span><i></i></a></div></div></div></div></div><script async="" src="/resources/nacara-standard-layouts/scripts/menu.js"></script></body></html>

0 commit comments

Comments
 (0)