TypeScript 中的 unknown 类型的用途

图片

TypeScript是一种发展非常快的语言,有时很难跟上它的步伐,有太多的特性不断发布, 我们可能会错过一些非常重要的珍宝。我认为 unknown 类型就是其中之一。

unknown  类型是什么?
 

unknown  类型是 TypeScript 3.0 版本引入的基本类型。

可以使用它来定义一个简单的变量或参数,如下面的例子所示。

 
let movie: unknown = "";
function printMovie(movie: unknown) {  console.log(movie);}
 

unknown 类型的作用
 

简单解释一下:它表示所有类型,在声明的时候,开发人员不确定(或不知道)如何使用该值,或者更具体地说,如何访问其成员(如果有的话)。

它是  any  的补充,但它以一种更类型安全的方式起作用。这意味着,直到你真正使用类型为  unknown  的值时,它才进行类型检查,但一旦你的代码开始对它进行假设,编译器将开始对其使用进行类型检查。

怎么会这样呢?让我们看一个例子,让它变得更清楚。

让我们从上面的 printMovie 函数开始。这个函数工作正常,因为 console.log 期望第一个参数的类型为 any ,并且 unknown 可以赋给另一个 unknown 值或 any 。

让我们在这个例子上再深入一点:

 
function formatMovie(movie: string) {  return `The movie title is ${movie}`;}
function printMovie(movie: unknown) {  console.log(formatMovie(movie));}

上面的代码片段不会编译,因为我们现在对 movie 参数做了假设,我们试图将它传递给另一个函数 formatMovie ,该函数期望的参数类型为 string 。当我们试图调用该函数,在期望 string 的地方传递一个 unknown 值时,编译器将产生一个错误。

现在你有一个选择,要么输入第一个 movie 参数作为一个 string ,要么输入其他可以转换为 string  的东西。

这里还有一个例子:

 
function printMovie(movie: unknown) {  console.log(    `The movie title is ${movie.title} and its rating is ${movie.rating}`,  );}

这是另一个在编译时失败的例子,因为我们假设  movie  是一个具有 title 和 rating 属性的对象。同样,在这一点上,我们至少可以用内联类型相应地输入它。

 
function printMovie(movie: { title: string; rating: number });
 

那么 any 呢?


我强烈反对在TS中滥用 any 类型。 any 的主要思想是表示可以是任何类型的类型。我们无法在编译时知道这些类型是什么,我的经验是,人们太快地使用 any ,而不是花时间编写适当的类型。

如果有可能编写类型,即使这些类型具有不同的结构或值,那么我们也应该编写它们。有几种方法可以做到这一点,例如使用泛型或联合类型,但关键是它们可以被类型化。我不想在这篇文章中过度地解释如何对它们进行类型化。

关键是, any  用于当您知道所讨论的类型不能被指定时,而 unknown 用于当您还不知道它是什么时。

什么时候应该使用它?


unknown  类型有几个用例,我们应该在这些场景中使用它:

1. 当从 JavaScript 文件迁移时
 

当从JavaScript代码库迁移时,可能会逐个文件地进行。假设你打开一个给定的文件,将其重命名为 .ts ,然后开始看到一些由于缺少类型而导致的错误。你可以这样做:

 
type Movie = unknown;
你可以为该文件中的类型创建类型别名,然后在需要时应用给定的类型,例如在函数中  function printMovie(movie: Movie) 。

完成这些之后,你可以回到  Movie  类型,并用所需的属性完成它。

这里应用的策略对其他场景也是一样的。

2. 当使用第三方库时,如果没有类型定义。
 

你可以开始创建一个定义文件(.d.ts),并开始填写你不确定的和目前未使用的 unknown 类型, 并输入你正在使用的东西,也许稍后会为它做一个 pull request。

3. 当使用未实现的 API 时。
 

如果你使用一个API来获取一些数据并使用该数据,那么你很可能已经知道了数据的类型,所以为了安全起见,你已经输入了数据类型。如果你不确定它的用途或你不知道数据应该如何发送,那么这就是 unknown 的良好用处。

 欢迎关注公众号:文本魔术,了解更多

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值