Typescript 实用程序类型

Q神日志 2023-08-07 15:52:04

在这篇小文章中我将讨论Typescript 的实用类型

实用程序类型是所有打字稿代码都可用的功能。让我们看看其中的一些:

对象的实用程序类型

首先让我们定义一些对象作为类型:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">User</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-name-color)">id</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">number</span><span style="color:var(--syntax-text-color)">;</span>
  <span style="color:var(--syntax-text-color)">name</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">string</span><span style="color:var(--syntax-text-color)">;</span>
  <span style="color:var(--syntax-text-color)">userName</span><span style="color:var(--syntax-text-color)">?:</span> <span style="color:var(--syntax-declaration-color)">string</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>

 

部分的

使该类型的所有属性都未定义。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>type PartialUser = Partial<User>;
</code></span></span>

 

部分图像。 所有属性都可以是未定义的

必需的

使该类型的所有属性都成为必需的。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>type RequiredUser = Required<User>;
</code></span></span>

 

图像 - 使所需类型的所有属性

忽略

我们可以省略该类型的某些属性并创建一个没有它的新类型。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>type OmitUserUsername = Omit<User, "userName">;
</code></span></span>

 

图像 - 删除 userName 属性

我们可以传递联合类型以获得更多属性:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>type OnlyId = Omit<User, "userName" | "name">;
</code></span></span>

 

图片 - 省略所有属性并仅使用 id

挑选

与 Omit 不同,我们可以选择该类型的一些属性

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>type PickId = Pick<User, "id">;
</code></span></span>

 

图片 - 仅选择 ID

作为省略,我们可以传递联合类型以获得更多属性:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>type WithoutUser = Pick<User, "id" | "userName">;
</code></span></span>

 

图像 - 没有用户属性的选择

只读

将属性变为只读

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>type ReadOnlyUser = Readonly<User>;
</code></span></span>

 

图像 - 用户的只读属性

如果我们尝试更改某些属性,则会出现一些错误:

图像 - 只读创建对象

图像 - 尝试更改某些属性时出错

联合类型的实用程序类型

让我们创建我们的联合类型:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">Role</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">admin</span><span style="color:var(--syntax-string-color)">"</span> <span style="color:var(--syntax-error-color)">|</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">user</span><span style="color:var(--syntax-string-color)">"</span> <span style="color:var(--syntax-error-color)">|</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">manager</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

排除

它将删除联合类型中的某些类型

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">NoUserRole</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">Exclude</span><span style="color:var(--syntax-error-color)"><</span><span style="color:var(--syntax-name-color)">Role</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">user</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-error-color)">></span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

图像 - 删除用户角色

提炼

让我们创建另一种联合类型:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">RoleAttributes</span> <span style="color:var(--syntax-error-color)">=</span>
  <span style="color:var(--syntax-error-color)">|</span> <span style="color:var(--syntax-text-color)">{</span>
      <span style="color:var(--syntax-name-color)">role</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">admin</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">;</span>
      <span style="color:var(--syntax-text-color)">permission</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">all</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">;</span>
    <span style="color:var(--syntax-text-color)">}</span>
  <span style="color:var(--syntax-error-color)">|</span> <span style="color:var(--syntax-text-color)">{</span>
      <span style="color:var(--syntax-name-color)">role</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">user</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">;</span>
    <span style="color:var(--syntax-text-color)">}</span>
  <span style="color:var(--syntax-error-color)">|</span> <span style="color:var(--syntax-text-color)">{</span>
      <span style="color:var(--syntax-name-color)">role</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">manager</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">;</span>
    <span style="color:var(--syntax-text-color)">};</span>
</code></span></span>

 

现在让我们提取admin使用:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">AdminRole</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">Extract</span><span style="color:var(--syntax-error-color)"><</span><span style="color:var(--syntax-name-color)">RoleAttributes</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">{</span> <span style="color:var(--syntax-name-color)">role</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">admin</span><span style="color:var(--syntax-string-color)">"</span> <span style="color:var(--syntax-text-color)">}</span><span style="color:var(--syntax-error-color)">></span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

图像 - 提取管理员角色

不可为空

让我们定义一个联合类型,其结果可以是字符串、空或未定义;

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">MaybeString</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">string</span> <span style="color:var(--syntax-error-color)">|</span> <span style="color:var(--syntax-declaration-color)">null</span> <span style="color:var(--syntax-error-color)">|</span> <span style="color:var(--syntax-declaration-color)">undefined</span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">NonNullableString</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">NonNullable</span><span style="color:var(--syntax-error-color)"><</span><span style="color:var(--syntax-name-color)">MaybeString</span><span style="color:var(--syntax-error-color)">></span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

图像 - 只有不带 null 和 undefined 的字符串

函数的实用程序类型

让我们定义我们的函数类型:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">myFunction</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-name-color)">a</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">number</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-name-color)">b</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">number</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-error-color)">=></span> <span style="color:var(--syntax-declaration-color)">number</span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

返回类型

return它将返回函数的类型

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">ReturnValueFunction</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">ReturnType</span><span style="color:var(--syntax-error-color)"><</span><span style="color:var(--syntax-name-color)">myFunction</span><span style="color:var(--syntax-error-color)">></span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

Image - 返回函数返回的类型

参数

它将返回函数参数的元组:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">MyParameters</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">Parameters</span><span style="color:var(--syntax-error-color)"><</span><span style="color:var(--syntax-name-color)">myFunction</span><span style="color:var(--syntax-error-color)">></span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

图片描述

期待

它将返回 Promise 的类型

让我们定义一种 Promise

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">PromiseUser</span><span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">Promise</span><span style="color:var(--syntax-error-color)"><</span><span style="color:var(--syntax-name-color)">User</span><span style="color:var(--syntax-error-color)">></span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">Result</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">Awaited</span><span style="color:var(--syntax-error-color)"><</span><span style="color:var(--syntax-name-color)">PromiseUser</span><span style="color:var(--syntax-error-color)">></span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

图像 - 返回用户的承诺类型

就是这样,伙计们!让我们看看有什么挑战吗?

定义该异步函数的结果类型:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">getMyName</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">async</span> <span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-error-color)">=></span> <span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">{</span>
    <span style="color:var(--syntax-name-color)">name</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">Kevin</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">,</span>
  <span style="color:var(--syntax-text-color)">};</span>
<span style="color:var(--syntax-text-color)">};</span>
</code></span></span>

 

我们如何获得字符串类型的对象?

答案:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">type</span> <span style="color:var(--syntax-name-color)">MyNameResult</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">Awaited</span><span style="color:var(--syntax-error-color)"><</span><span style="color:var(--syntax-name-color)">ReturnType</span><span style="color:var(--syntax-error-color)"><</span><span style="color:var(--syntax-declaration-color)">typeof</span> <span style="color:var(--syntax-name-color)">getMyName</span><span style="color:var(--syntax-error-color)">>></span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

图像 - 对象类型仅包含字符串

所以,谢谢你们走到这一步。
就是这样,Typescript 提供了一些可以帮助您进行开发的实用程序类型。

...全文
195 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

6

社区成员

发帖
与我相关
我的任务
社区描述
分享
java-rocketmqpygame前端 个人社区 广东省·广州市
社区管理员
  • Q shen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧