{"id":14291,"url":"\/distributions\/14291\/click?bit=1&hash=257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","hash":"257d5375fbb462be671b713a7a4184bd5d4f9c6ce46e0d204104db0e88eadadd","title":"\u0420\u0435\u043a\u043b\u0430\u043c\u0430 \u043d\u0430 Ozon \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0434\u0430\u0451\u0442","buttonText":"","imageUuid":""}

Новое слово в TypeScript 5.2

TypeScript 5.2 представит новое ключевое слово - using, которое можно использовать, чтобы избавиться от чего угодно с помощью функции Symbol.dispose, при покидании области видимости.

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

Обосновано это предложениями TC39, достигшими недавно Фазы 3, что демонстрирует скорое появление в JavaScript.

using будет очень полезным для управления ресурсами, такими как ссылки на файлы, соединения с базами данных и т.п.

Symbol.dispose

Symbol.dispose - новый глобальный символ в JavaScript. Всё что угодно с функцией, присвоенной Symbol.dispose будет рассматриваться как 'ресурс' - "объект с особым жизненным циклом" - и может быть использовано со словом using.

const resource = { [Symbol.dispose]: () => { console.log("Hooray!"); }, };

await using

Вы также можете использовать Symbol.asyncDispose и await using чтобы управлять ресурсами, которые должны быть распределены асинхронно.

const getResource = () => ({ [Symbol.asyncDispose]: async () => { await someAsyncFunc(); }, }); { await using resource = getResource(); }

Будет ожидать функцию Symbol.asyncDispose для продолжения.

Это будет полезно для ресурсов типа коннекторов БД, когда необходимо убедиться, что соединение закрыто, прежде чем продолжать.

Случаи использования

Указатели на файлы

Доступ к файловой системе с помощью хэндлеров на ноде может быть намного проще с using.

До:

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

После:

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 = getFileHandle("thefile.txt"); // Do stuff with file.filehandle } // Automatically disposed!

Соединения с БД

До:

const connection = await getDb(); try { // Do stuff with connection } finally { await connection.close(); }

После:

const getConnection = async () => { const connection = await getDb(); return { connection, [Symbol.asyncDispose]: async () => { await connection.close(); }, }; }; { await using { connection } = getConnection(); // Do stuff with connection } // Automatically closed!

Спасибо за внимание! Больше интересного по фронтенду - тут.

0
Комментарии
-3 комментариев
Раскрывать всегда