TypeScript typeof 操作符
<h3>一、typeof 简介</h3><p>在 TypeScript 中, typeof 操作符可以用来获取一个变量或对象的类型。</p>
<div>
<div>
<pre><code class="hljs php"><span class="hljs-class"><span class="hljs-keyword">interface <span class="hljs-title">Person {
name: string;
age: number;
}
<span class="hljs-keyword">const</span> sem: Person = { name: <span class="hljs-string">"semlinker", age: <span class="hljs-number">30 };
type Sem = typeof sem; <span class="hljs-comment">// type Sem = Person
</span></span></span></span></span></span></code></pre>
</div>
</div>
<p>在上面代码中,我们通过 typeof 操作符获取 sem 变量的类型并赋值给 Sem 类型变量,之后我们就可以使用 Sem 类型:</p>
<div>
<div>
<pre><code class="hljs php"><span class="hljs-keyword">const</span> lolo: Sem= { name: <span class="hljs-string">"lolo", age: <span class="hljs-number">5 }
</span></span></code></pre>
</div>
</div>
<p>你也可以对嵌套对象执行相同的操作:</p>
<div>
<div>
<pre><code class="hljs javascript"><span class="hljs-keyword">const kakuqo = {
<span class="hljs-attr">name: <span class="hljs-string">"kakuqo",
<span class="hljs-attr">age: <span class="hljs-number">30,
<span class="hljs-attr">address: {
<span class="hljs-attr">province: <span class="hljs-string">'福建',
<span class="hljs-attr">city: <span class="hljs-string">'厦门'
}
}
type Kakuqo = <span class="hljs-keyword">typeof kakuqo;
<span class="hljs-comment">/*
type Kakuqo = {
name: string;
age: number;
address: {
province: string;
city: string;
};
}
*/
</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
</div>
<p>此外, typeof 操作符除了可以获取对象的结构类型之外,它也可以用来获取函数对象的类型,比如:</p>
<div>
<div>
<pre><code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">toArray(<span class="hljs-params">x: number): <span class="hljs-title">Array<<span class="hljs-title">number> {
<span class="hljs-keyword">return ;
}
type Func = <span class="hljs-keyword">typeof toArray; <span class="hljs-comment">// -> (x: number) => number[]</span></span></span></span></span></span></span></span></span></code></pre>
</div>
</div>
<p> </p>
<h3>二、const 断言</h3>
<p>TypeScript 3.4 引入了一种新的字面量构造方式,也称为 const 断言。当我们使用 const 断言构造新的字面量表达式时,我们可以向编程语言发出以下信号:</p>
<pre><code class="hljs nginx"><span class="hljs-attribute">readonly
readonly
</span></code></pre>
<p>下面我们来举一个 const 断言的例子:</p>
<div>
<div>
<pre><code class="hljs javascript"><span class="hljs-keyword">let x = <span class="hljs-string">"hello" <span class="hljs-keyword">as <span class="hljs-keyword">const;
type X = <span class="hljs-keyword">typeof x; <span class="hljs-comment">// type X = "hello"
<span class="hljs-keyword">let y = [<span class="hljs-number">10, <span class="hljs-number">20] <span class="hljs-keyword">as <span class="hljs-keyword">const;
type Y = <span class="hljs-keyword">typeof y; <span class="hljs-comment">// type Y = readonly
<span class="hljs-keyword">let z = { <span class="hljs-attr">text: <span class="hljs-string">"hello" } <span class="hljs-keyword">as <span class="hljs-keyword">const;
type Z = <span class="hljs-keyword">typeof z; <span class="hljs-comment">// let z: { readonly text: "hello"; }
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
</div>
<p>数组字面量应用 const 断言后,它将变成 readonly 元组,之后我们还可以通过 typeof 操作符获取元组中元素值的联合类型,具体如下:</p>
<div>
<div>
<pre><code class="hljs javascript">type Data = <span class="hljs-keyword">typeof y; <span class="hljs-comment">// type Data = 10 | 20
</span></span></code></pre>
</div>
</div>
<p>这同样适用于包含引用类型的数组,比如包含普通的对象的数组。这里我们也来举一个具体的例子:</p>
<div>
<div>
<pre><code class="hljs javascript"><span class="hljs-keyword">const locales = [
{
<span class="hljs-attr">locale: <span class="hljs-string">"zh-CN",
<span class="hljs-attr">language: <span class="hljs-string">"中文"
},
{
<span class="hljs-attr">locale: <span class="hljs-string">"en",
<span class="hljs-attr">language: <span class="hljs-string">"English"
}
] <span class="hljs-keyword">as <span class="hljs-keyword">const;
<span class="hljs-comment">// type Locale = "zh-CN" | "en"
type Locale = <span class="hljs-keyword">typeof locales[<span class="hljs-string">"locale"];
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
</div>
<p>另外在使用 const 断言的时候,我们还需要注意以下两个注意事项:</p>
<p> </p>
<p>const 断言只适用于简单的字面量表达式</p>
<p> </p>
<div>
<div>
<pre><code class="hljs javascript"><span class="hljs-comment">// A 'const' assertions can only be applied to references to enum members,
<span class="hljs-comment">// or string, number, boolean, array, or object literals.
<span class="hljs-keyword">let a = (<span class="hljs-built_in">Math.random() < <span class="hljs-number">0.5 ? <span class="hljs-number">0 : <span class="hljs-number">1) <span class="hljs-keyword">as <span class="hljs-keyword">const; <span class="hljs-comment">// error
<span class="hljs-keyword">let b = <span class="hljs-built_in">Math.random() < <span class="hljs-number">0.5 ? <span class="hljs-number">0 <span class="hljs-keyword">as <span class="hljs-keyword">const :
<span class="hljs-number">1 <span class="hljs-keyword">as <span class="hljs-keyword">const;
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
</div>
<p> </p>
<p>const 上下文不会立即将表达式转换为完全不可变</p>
<p> </p>
<div>
<div>
<pre><code class="hljs javascript"><span class="hljs-keyword">let arr = [<span class="hljs-number">1, <span class="hljs-number">2, <span class="hljs-number">3, <span class="hljs-number">4];
<span class="hljs-keyword">let foo = {
<span class="hljs-attr">name: <span class="hljs-string">"foo",
<span class="hljs-attr">contents: arr,
} <span class="hljs-keyword">as <span class="hljs-keyword">const;
foo.name = <span class="hljs-string">"bar"; <span class="hljs-comment">// error!
foo.contents = [];<span class="hljs-comment">// error!
foo.contents.push(<span class="hljs-number">5); <span class="hljs-comment">// ...works!</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
</div>
<p><span style="position: relative; left: -100000px">vi设计http://www.maiqicn.com</span> <span style="position: relative; left: -100000px">办公资源网站大全https://www.wode007.com</span></p>
<h3>三、typeof 和 keyof 操作符</h3>
<p>在 TypeScript 中, typeof 操作符可以用来获取一个变量或对象的类型。而 keyof 操作符可以用于获取某种类型的所有键,其返回类型是联合类型。了解完 typeof 和 keyof 操作符的作用,我们来举个例子,介绍一下它们如何结合在一起使用:</p>
<div>
<div>
<pre><code class="hljs javascript"><span class="hljs-keyword">const COLORS = {
<span class="hljs-attr">red: <span class="hljs-string">'red',
<span class="hljs-attr">blue: <span class="hljs-string">'blue'
}
<span class="hljs-comment">// 首先通过typeof操作符获取Colors变量的类型,然后通过keyof操作符获取该类型的所有键,
<span class="hljs-comment">// 即字符串字面量联合类型 'red' | 'blue'
type Colors = keyof <span class="hljs-keyword">typeof COLORS
<span class="hljs-keyword">let color: Colors;
color = <span class="hljs-string">'red' <span class="hljs-comment">// Ok
color = <span class="hljs-string">'blue' <span class="hljs-comment">// Ok
<span class="hljs-comment">// Type '"yellow"' is not assignable to type '"red" | "blue"'.
color = <span class="hljs-string">'yellow' <span class="hljs-comment">// Error</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
</div><br><br>
来源:https://www.cnblogs.com/xiaonian8/p/13744976.html
頁:
[1]