TypeScript 参数属性
<table class="d-block"><tbody class="d-block">
<tr class="d-block">
<td class="d-block comment-body markdown-body js-comment-body rgh-linkified-code">
<p>假设类中创建的 <code>readonly</code> 类型的属性,该类型的属性只能在声明处或构造器中进行初始化。</p>
<div class="highlight highlight-source-ts"><pre><span class="pl-k">class</span> <span class="pl-en">Octopus</span> {
<span class="pl-k">readonly</span> name<span class="pl-k">:</span> <span class="pl-c1">string</span>;
<span class="pl-k">readonly</span> numberOfLegs<span class="pl-k">:</span> <span class="pl-c1">number</span> <span class="pl-k">=</span> <span class="pl-c1">8</span>;
<span class="pl-k">constructor</span> (<span class="pl-v">theName</span><span class="pl-k">:</span> <span class="pl-c1">string</span>) {
<span class="pl-c1">this</span>.<span class="pl-c1">name</span> <span class="pl-k">=</span> <span class="pl-smi">theName</span>;
}
}</pre></div>
<p>为了初始化 <code>name</code> 属性,不得不在构造器中声明另一个入参 <code>theName</code>。这显得冗余。</p>
<p>TypeScript 提供了在构造器上同时完成属性的声明和初始化的功能。</p>
<p>以下代码和上面的等效:</p>
<div class="highlight highlight-source-ts"><pre><span class="pl-k">class</span> <span class="pl-en">Octopus</span> {
<span class="pl-k">readonly</span> numberOfLegs<span class="pl-k">:</span> <span class="pl-c1">number</span> <span class="pl-k">=</span> <span class="pl-c1">8</span>;
<span class="pl-k">constructor</span>(<span class="pl-k">readonly</span> <span class="pl-v">name</span><span class="pl-k">:</span> <span class="pl-c1">string</span>) {
}
}</pre></div>
<p>这种通过在构造器的入参中声明属性的方式叫作 Parameter properties。</p>
<p><strong>通过在构造器入参上添加访问限定符(accessibility modifier ),<code>readonly</code> 或两者结合,该参入便会成为类的属性。</strong></p>
<p>一个比较综合的示例:</p>
<div class="highlight highlight-source-ts"><pre><span class="pl-k">class</span> <span class="pl-en">Foo</span> {
a<span class="pl-k">:</span> <span class="pl-c1">string</span>;
<span class="pl-k">public</span> b<span class="pl-k">:</span> <span class="pl-c1">string</span>;
<span class="pl-k">protected</span> c<span class="pl-k">:</span> <span class="pl-c1">string</span>;
<span class="pl-k">constructor</span>(<span class="pl-v">d</span><span class="pl-k">:</span> <span class="pl-c1">number</span>, <span class="pl-k">public</span> <span class="pl-v">e</span><span class="pl-k">:</span> <span class="pl-c1">string</span>) {}
}
<p><span class="pl-k">var</span> foo <span class="pl-k">=</span> <span class="pl-k">new</span> <span class="pl-en">Foo</span>(<span class="pl-c1">1</span>, <span class="pl-s"><span class="pl-pds">"</span>2<span class="pl-pds">"</span></span>);</p>
<p><span class="pl-c1">console</span>.<span class="pl-c1">log</span>(<span class="pl-smi">foo</span>.<span class="pl-smi">a</span>); <span class="pl-c"><span class="pl-c">//</span> ✅ <code>a</code> 没有修饰词,和 C++ struct 默认公有表现一样为 <code>public</code>,与 C++ class 默认私有刚好相反</span><br>
<span class="pl-c1">console</span>.<span class="pl-c1">log</span>(<span class="pl-smi">foo</span>.<span class="pl-smi">b</span>); <span class="pl-c"><span class="pl-c">//</span> ✅ <code>b</code> 是公有</span><br>
<span class="pl-c1">console</span>.<span class="pl-c1">log</span>(<span class="pl-smi">foo</span>.<span class="pl-smi">c</span>); <span class="pl-c"><span class="pl-c">//</span> 🚨 <code>a</code> <code>protected</code> 只能自己和继承类中访问</span><br>
<span class="pl-c1">console</span>.<span class="pl-c1">log</span>(<span class="pl-smi">foo</span>.<span class="pl-smi">d</span>); <span class="pl-c"><span class="pl-c">//</span> 🚨 <code>d</code> 没有修饰词,不是入参属性,类上面没有该属性</span><br>
<span class="pl-c1">console</span>.<span class="pl-c1">log</span>(<span class="pl-smi">foo</span>.<span class="pl-smi">e</span>); <span class="pl-c"><span class="pl-c">//</span> ✅ <code>a</code> 通过构造器创建的 <code>public</code> 属性</span></p></pre></div><p></p>
<h2>相关资源</h2>
<ul>
<li>TypeScript - Parameter properties</li>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
<div id="MySignature" role="contentinfo">
<div>
<img src="https://licensebuttons.net/l/by-nc-sa/3.0/88x31.png" style="vertical-align: middle">
<strong>CC BY-NC-SA 署名-非商业性使用-相同方式共享</strong>
</div><br><br>
来源:https://www.cnblogs.com/Wayou/p/typescript_parameter_property.html
頁:
[1]