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

от автора

Привет! Представляю вашему вниманию перевод статьи Matt Pocock.
Источник

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!

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


ссылка на оригинал статьи https://habr.com/ru/articles/745514/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *