Typescript 5.2 using 키워드란 무엇인가

using은 tc39에 실린 내용.

함수 객체에 Symbol.dispose라고 하는 global symbol이 속성으로 할당되어 있으면 이 함수는 리소스로 판단되며 유저에 의해 직접 생명주기를 명령형으로 조절(Symbol.dispose)를 호출하거나 선언적으로 using 키워드를 사용해서 관리가 가능하다.

// 동기
import { open } from "fs-sync";
const getFileHandler = () => {
  const fileHandler = open("...", "r+");
  return {
    fileHandler,
    [Symbol.Dispose]: () => {
      fileHandler.close();
    },
  };
};

{
  using file = getFileHandler("dante.txt");
  // 파일 핸들러 사용
  file.fileHandler
} // 블록을 벗어나면 리소스 해제
// 비동기
import { open } from "node:fs/promises";
const getFileHandler = async () => {
  const fileHandler = await open("...", "r+");
  return {
    fileHandler,
    [Symbol.asyncDispose]: async () => {
      await fileHandler.close();
    },
  };
};

{
  await using file = getFileHandler("dante.txt");
  // 파일 핸들러 사용 
  file.fileHandler
} // 블록을 벗어나면 리소스 해제

using 사용 시

// Symbol.dispose 함수를 가진 객체를 반환하는 함수
const getConnection = (host: string, port: number) => {
  // ..
  return {
    socket,
    [Symbol.dispose]: () => {
      socket.end();
    },
  };
};
import React, { useEffect, useState } from "react";
import { getConnection } from "~/utils";

const NetworkComponent = ({ path }) => {
  const [networkHandle, setNetworkHandle] = useState(null);
  const [content, setContent] = useState("");

  useEffect(() => {
    using networkHandle = getConnection()
    setNetworkHandle(networkHandle.socket);
    // 컴포넌트가 언마운트될 때 자동으로 네트워크 핸들이 닫힘
  }, []);

  // 파일 내용을 읽어오는 함수
  const read = async () => {
    const buffer = await networkHandle.read();
    setContent(buffer.toString());
  };

  // 파일 내용을 수정하는 함수
  const write = async (newContent) => {
    await networkHandle.write(newContent);
    setContent(newContent);
  };

  return (
    <div>
      <h1>File: {path}</h1>
      <button onClick={readFile}>Read</button>
      <textarea value={content} onChange={(e) => write(e.target.value)} />
    </div>
  );
};