Эта статья — перевод оригинальной статьи "TypeScript 5.2's New Keyword: 'using'".
Также я веду телеграм канал “Frontend по-флотски”, где рассказываю про интересные вещи из мира разработки интерфейсов.
В TypeScript 5.2 появится новое ключевое слово 'using', которое можно будет использовать для утилизации чего-либо с помощью функции Symbol.dispose, когда оно покидает область видимости.
{
const getResource = () => {
return {
[Symbol.dispose]: () => {
console.log('Hooray!')
}
}
}
using resource = getResource();
} // 'Hooray!
Он основан на предложении TC39, которое недавно достигло третьей стадии (из четырех) в своем продвижении к JavaScript. Это означает, что оно готово к тестированию ранними пользователями.
using
будет чрезвычайно полезно для управления такими ресурсами, как обработчик файлов, соединения с базами данных и т.д.
Symbol.dispose
Symbol.dispose - это новый глобальный символ в JavaScript. Все, что имеет функцию, назначенную Symbol.dispose
, будет считаться "ресурсом" - "объектом с определенным временем жизни" - и может быть использовано с ключевым словом using
.
const resource = {
[Symbol.dispose]: () => {
console.log("Hooray!");
},
};
await using
Для работы с ресурсами, которые необходимо утилизировать асинхронно, можно также использовать Symbol.asyncDispose
и await
.
const getResource = () => ({
[Symbol.asyncDispose]: async () => {
await someAsyncFunc();
},
});
{
await using resource = getResource();
}
В результате перед продолжением программы будет ожидаться функция Symbol.asyncDispose
.
Это будет полезно для таких ресурсов, как соединения с базами данных, когда необходимо убедиться, что соединение закрыто до продолжения работы программы.
Примеры использования
Управление файлами
Доступ к файловой системе через файловые обработчики в node может быть значительно проще с 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
} // автоматически утилизирован!
Соединения с базой данных
Управление соединениями с базами данных - один из распространенных вариантов использования в C#.
Без using
:
const connection = await getDb();
try {
// Делаем что-нибудь с connections
} 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
} // автоматически закрыто!