동도리 개발 로그

[JS, Typescript] 새로운 선언 using 본문

개발/공통

[JS, Typescript] 새로운 선언 using

동돌이 2023. 7. 7. 10:16
반응형

자바스크립트 와 타입스크립트에 새로운 선언 키워드가 추가된다고한다. (typescript 5.2 버전 기준 - 2023.7.7 현재는 베타버전)

goLang의 defer 와 비슷한 동작을 하는 키워드이다.

 

https://devblogs.microsoft.com/typescript/announcing-typescript-5-2-beta/#using-declarations-and-explicit-resource-management

 

Announcing TypeScript 5.2 Beta - TypeScript

Today we are excited to announce the availability of TypeScript 5.2 Beta. To get started using the beta, you can get it through NuGet, or through npm with the following command: npm install -D typescript@beta Here’s a quick list of what’s new in TypeSc

devblogs.microsoft.com

https://www.totaltypescript.com/typescript-5-2-new-keyword-using

 

TypeScript 5.2's New Keyword: 'using'

TypeScript 5.2 introduces 'using', a keyword that disposes anything with a `Symbol.dispose` function upon leaving scope, making resource management easier.

www.totaltypescript.com

var, let, const 이 외에 using이라는 키워드가 추가된다. 

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

 using으로 선언된 스코프를 벗어나면 자동으로 Symbol.dispose 로 선언된 부분이 실행이 된다.

 

이전과 비교하자면

 

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

코드가 조금 길어진 것 같지만 실제 사용하다보면 미리선언만하면 신경 안써도 된다는 부분이 편할 것 같다.

 

C# 을 참고하여 만들어졌다고 하는데 DB 커넥션에 유용하게 사용 될 거라고 한다. 

 

DB Connection

 using 사용 전

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

 using 사용 후

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

 

DB 커넥션은 close() 해야 하는데 미리선언만 하면 되니 편리 할 것 같다.

반응형