TypeScript5.2 引入了一个新的关键字 using, 它可以用来处理任何具有 Symbol.dispose 函数的对象,当它离开作用域时立即释放。

{
  const getResource = () => {
    return {
      [Symbol.dispose]: () => {
        console.log('Hooray!')
      }
    }
  }
 
  using resource = getResource();
} // 'Hooray!' logged to console

Await using

可以使用 Symbol.asyncDisposeawait using 来处理需要异步释放的资源,例如通过文件句柄访问文件系统
使用 using 之前

import { open } from "node:fs/promises";
 
let filehandle;
try {
  filehandle = await open("thefile.txt", "r");
} finally {
  await filehandle?.close();
}

使用 using

import { open } from "node:fs/promises";
 
const getFileHandle = async (path: string) => {
  const filehandle = await open(path, "r");
 
  return {
    filehandle,
    [Symbol.asyncDispose]: async () => {
      await filehandle.close();
    },
  };
};
 
{
  await using file = await getFileHandle("thefile.txt");
 
  // 使用 file.filehandle 做一些事情
 
} // 自动释放!

还有数据库链接,使用 using 之前

const connection = await getDb();
 
try {
  // 使用 connection 做一些事情
} finally {
  await connection.close();
}

使用 using

const getConnection = async () => {
  const connection = await getDb();
 
  return {
    connection,
    [Symbol.asyncDispose]: async () => {
      await connection.close();
    },
  };
};
 
{
  await using db = await getConnection();
 
  // 使用 db.connection 做一些事情
 
} // 自动关闭!