好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

阅读“宣布 TypeScript 4.9 Beta”

阅读“宣布 TypeScript 4.9 Beta”

继续上次的, 宣布 TypeScript 4.9 Beta 我会读。
(只要有兴趣,我想继续……)

满足运算符

添加了一个新的“不影响类型推断,只是类型检查”运算符。
下面的示例检查 Record<string, number | number[]> 类型是否可赋值,但结果推断为 {hoge: number, fuga: number[]} 类型。

  const   sample   =   { 
   hoge  :   3  , 
   fuga  :   [  2  ,   4  ,   6  ], 
 }   satisfies   Record  <  string  ,   number   |   number  []  >  ; 

 sample  .  fuga  [  2  ];   // 4 
 

在上面的例子中,如果给样本 Record<string, number | number[]> 类型,会出现错误,因为 sample.fuga 可能是 number 类型。

  const   sample  :   Record  <  string  ,   number   |   number  []  >   =   { 
   hoge  :   3  , 
   fuga  :   [  2  ,   4  ,   6  ], 
 }; 

 sample  .  fuga  [  2  ];   // ERROR 
 

我不知道这有多大用处,但就个人而言,我认为使用它来检查某个变量是否具有某种类型,而不是用于赋值会更有用。。
例如,模式匹配允许您检查是否详尽。这很容易,因为您可以在没有库的情况下做到这一点。

  const   sample   =   (  a  :   '  b  '   |   '  c  '   |   '  d  '  )   =>   { 
   if   (  a   ===   '  b  '  )   return   1  ; 
   if   (  a   ===   '  c  '  )   return   2  ; 
   a   satisfies   never  ;   // ERROR 
 }; 
 

稍后,您还可以检查该函数的函数何时被调用。

  const   sample   =   (  f  :   (  a  :   string  )   =>   (  b  :   number  )   =>   void  )   =>   { 
   f  (  '  hoge  '  )(  3  )   satisfies   void  ; 
   f  (  '  hoge  '  )   satisfies   void  ;   // ERROR 
 }; 
 

看起来不多,但是……也许你可以在想“这样可以吗?”的时候写出来。
不过在写的那一刻,我还是有些满足的,但是等冷静下来,代码就变得乱七八糟,感觉可读性快要下降了。 . .

暂时 await 也可以作为防遗忘的对策。

  const   asyncFunc   =   async   ()   =>   {}; 
 const   sample   =   async   ()   =>   { 
   await   asyncFunc  ()   satisfies   void  ; 
   asyncFunc  ()   satisfies   void  ;   // ERROR 
 }; 
 

但是,如果您忘记了 await ,那么您似乎忘记了添加 satisfies 。那不是很现实吗? . .

使用 in 运算符缩小未列出的属性

in 运算符现在缩小未明确列出的属性。 (直到现在我都做不到……)

如下图,如果 Property 被显式声明, in 操作符已经有效地缩小了范围。

  const   sample   =   (  a  :   {  b  :   string  }   |   {  c  :   number  })   =>   { 
   if   (  '  b  '   in   a  ){ 
     a  ;   // {b: string} 
     a  .  b  ;   // string 
   } 
 }; 
 

如果没有显式声明,则不会缩小,但会缩小到 object & Record<"b", unknown> 类型。

  const   sample   =   (  a  :   object  )   =>   { 
   if   (  '  b  '   in   a  ){ 
     a  .  b  ;   // 4.8まではエラー 
   } 
 }; 
 

检查 NaN 是否相等

与容易出现错误的 NaN 的相等比较现在被视为错误。它会警告您正确使用 isNaN。

  const   sample   =   (  a  :   number  )   =>   { 
   if   (  a   ===   NaN  )   return   undefined  ;   // ERROR 
   return   a   +   1  ; 
 }; 
 

文件监视现在使用文件系统事件

似乎监视文件更改的机制将从轮询变为 OS 文件系统事件。直到那时的历史都被写了下来。

Promise.resolve 的更好类型

Promise.resolve 的返回类型已更改。
我已经尝试了一些事情,下面的代码有所作为。
以前,收到了 T | PromiseLike<T> 并返回了 Promise<T> ,但现在看来Promise 已经用 Awaited 正确解决了。
就我使用它而言,这不是问题,但库开发人员可能需要关注它。

  const   sample   =   ()   =>   { 
   // 4.8     ではPromise<Promise<unknonw>>型 
   // 4.9beta ではPromise<unknonw>型 
   const   a   =   Promise  .  resolve  ({}   as   Promise  <  Promise  <  unknown  >>  ); 
 }; 
 

其他

除了上述之外,还有其他项目,但我只会总结链接。

lib.d.ts 更新 JavaScript Emit 不再省略导入 出口优先于类型版本 替换为 SubstitutionTypes 上的约束


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308628088.html

查看更多关于阅读“宣布 TypeScript 4.9 Beta”的详细内容...

  阅读:47次