阅读“宣布 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>>);
};

其他

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


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

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

相关文章: