> 웹 프론트엔드 > JS 튜토리얼 > 개발을 강화하는 고급 TypeScript 기능

개발을 강화하는 고급 TypeScript 기능

Patricia Arquette
풀어 주다: 2025-01-06 18:53:43
원래의
471명이 탐색했습니다.

dvanced TypeScript Features to Supercharge Your Development

베스트셀러 작가로서 Amazon에서 제 책을 탐색해 보시기 바랍니다. Medium에서 저를 팔로우하고 지지를 표시하는 것을 잊지 마세요. 감사합니다! 당신의 지원은 세상을 의미합니다!

TypeScript는 JavaScript 애플리케이션 작성 방식에 혁명을 일으켰습니다. TypeScript를 광범위하게 사용해 본 개발자로서 저는 강력하고 유지 관리 가능하며 확장 가능한 애플리케이션을 만드는 데 있어서 TypeScript의 힘을 높이 평가하게 되었습니다. 이 기사에서는 개발 프로세스를 크게 향상시킬 수 있는 7가지 고급 TypeScript 기능에 대한 저의 경험과 통찰력을 공유하겠습니다.

Type Guard는 조건부 블록 내에서 유형의 범위를 좁힐 수 있는 TypeScript의 강력한 도구입니다. 이는 공용체 유형으로 작업하거나 유형별 작업을 수행해야 할 때 특히 유용합니다. 유형 안전성과 코드 가독성을 모두 향상시키는 데 유형 가드가 매우 중요하다는 것을 알았습니다.

실제 예를 살펴보겠습니다.

function processValue(value: string | number) {
  if (typeof value === "string") {
    // TypeScript knows that 'value' is a string here
    console.log(value.toUpperCase());
  } else {
    // TypeScript knows that 'value' is a number here
    console.log(value.toFixed(2));
  }
}
로그인 후 복사
로그인 후 복사
로그인 후 복사

이 코드에서 typeof 검사는 유형 가드 역할을 하여 TypeScript가 각 블록 내에서 올바른 유형을 추론할 수 있도록 합니다. 이를 통해 오류를 방지하고 유형별 방법을 자신있게 사용할 수 있습니다.

더 복잡한 시나리오를 위해 사용자 정의 유형 가드를 만들 수도 있습니다.

interface Dog {
  bark(): void;
}

interface Cat {
  meow(): void;
}

function isDog(animal: Dog | Cat): animal is Dog {
  return (animal as Dog).bark !== undefined;
}

function makeSound(animal: Dog | Cat) {
  if (isDog(animal)) {
    animal.bark(); // TypeScript knows this is safe
  } else {
    animal.meow(); // TypeScript knows this is safe
  }
}
로그인 후 복사
로그인 후 복사

매핑 유형은 제가 매우 유용하다고 생각하는 또 다른 기능입니다. 이를 통해 기존 유형을 기반으로 새로운 유형을 생성할 수 있으므로 코드 중복이 크게 줄어들고 유형 정의가 더욱 동적으로 만들어집니다.

다음은 매핑된 유형을 사용하여 인터페이스의 읽기 전용 버전을 생성한 방법의 예입니다.

interface User {
  id: number;
  name: string;
  email: string;
}

type ReadonlyUser = {
  readonly [K in keyof User]: User[K];
};

const user: ReadonlyUser = {
  id: 1,
  name: "John Doe",
  email: "john@example.com",
};

// This would cause a TypeScript error
// user.name = "Jane Doe";
로그인 후 복사
로그인 후 복사

조건부 유형은 내 TypeScript 프로젝트의 판도를 바꿔 놓았습니다. 이를 통해 다른 유형에 의존하는 유형 정의를 생성할 수 있으므로 보다 유연하고 표현력이 풍부한 유형 시스템이 가능해집니다.

저는 일반 함수를 사용할 때 조건부 유형을 자주 사용합니다.

type NonNullable<T> = T extends null | undefined ? never : T;

function processValue<T>(value: T): NonNullable<T> {
  if (value === null || value === undefined) {
    throw new Error("Value cannot be null or undefined");
  }
  return value as NonNullable<T>;
}

const result = processValue("Hello"); // Type is string
const nullResult = processValue(null); // TypeScript error
로그인 후 복사

리터럴 유형은 제가 매우 유용하다고 생각하는 또 다른 기능입니다. 이를 통해 정확한 값을 나타내는 유형을 정의할 수 있으며, 이는 오류를 방지하고 유형 검사를 개선하는 데 매우 도움이 될 수 있습니다.

다음은 내 코드에서 리터럴 유형을 사용하는 방법의 예입니다.

type Direction = "north" | "south" | "east" | "west";

function move(direction: Direction) {
  // Implementation
}

move("north"); // This is valid
// move("up"); // This would cause a TypeScript error
로그인 후 복사

차별화된 조합은 내 TypeScript 툴킷의 필수 부분이 되었습니다. 공용체 유형을 공통 판별 속성과 결합하여 더 정확한 유형 정의와 복잡한 데이터 구조를 더 쉽게 처리할 수 있습니다.

다음은 차별적인 공용체를 사용하는 방법의 예입니다.

interface Square {
  kind: "square";
  size: number;
}

interface Rectangle {
  kind: "rectangle";
  width: number;
  height: number;
}

type Shape = Square | Rectangle;

function calculateArea(shape: Shape) {
  switch (shape.kind) {
    case "square":
      return shape.size * shape.size;
    case "rectangle":
      return shape.width * shape.height;
  }
}
로그인 후 복사

제네릭은 재사용 가능한 구성 요소와 기능을 만들기 위해 자주 사용하는 강력한 기능입니다. 이를 통해 유형 안전성을 유지하면서 여러 유형에서 작동할 수 있는 코드를 작성할 수 있습니다.

다음은 제가 사용할 수 있는 일반 함수의 예입니다.

function processValue(value: string | number) {
  if (typeof value === "string") {
    // TypeScript knows that 'value' is a string here
    console.log(value.toUpperCase());
  } else {
    // TypeScript knows that 'value' is a number here
    console.log(value.toFixed(2));
  }
}
로그인 후 복사
로그인 후 복사
로그인 후 복사

데코레이터는 클래스 작업 시 특히 유용한 기능입니다. 이를 통해 메타데이터를 추가하거나 런타임 시 클래스, 메소드 및 속성의 동작을 수정할 수 있습니다.

다음은 제가 사용할 수 있는 간단한 데코레이터의 예입니다.

interface Dog {
  bark(): void;
}

interface Cat {
  meow(): void;
}

function isDog(animal: Dog | Cat): animal is Dog {
  return (animal as Dog).bark !== undefined;
}

function makeSound(animal: Dog | Cat) {
  if (isDog(animal)) {
    animal.bark(); // TypeScript knows this is safe
  } else {
    animal.meow(); // TypeScript knows this is safe
  }
}
로그인 후 복사
로그인 후 복사

이러한 고급 TypeScript 기능을 통해 개발 프로세스가 크게 향상되었습니다. 덕분에 더욱 강력하고 유형이 안전한 코드를 작성하고, 개발 주기 초기에 오류를 포착하고, 유지 관리가 더 용이한 애플리케이션을 만들 수 있었습니다.

Type Guard는 외부 API의 데이터로 작업하는 시나리오에서 특히 유용했습니다. 이를 통해 유형을 안전하게 좁히고 런타임 오류 위험 없이 다양한 사례를 처리할 수 있습니다.

매핑 유형을 사용하면 반복적인 유형 정의를 작성하는 데 드는 수많은 시간을 절약할 수 있습니다. 이를 사용하여 모든 속성을 선택 사항 또는 읽기 전용으로 만드는 등 다양한 방식으로 기존 인터페이스를 변환하는 유틸리티 유형을 만들었습니다.

복잡한 일반 함수를 사용할 때 조건부 유형은 매우 중요했습니다. 이를 통해 입력 유형에 따라 조정되는 보다 유연한 유형 정의를 생성하여 보다 표현력이 풍부하고 정확한 유형 시스템을 만들 수 있었습니다.

리터럴 유형은 잘못된 문자열 또는 숫자 값과 관련된 버그를 방지하는 획기적인 요소였습니다. 구성 개체에 대한 유효한 옵션을 정의하는 데 이를 광범위하게 사용하여 허용된 값만 사용되도록 했습니다.

차별화된 공용체는 React 애플리케이션에서 상태 관리 작업을 할 때 특히 유용했습니다. 이를 통해 다양한 상태에 대한 정확한 유형을 정의할 수 있어 복잡한 UI 로직을 더 쉽게 처리하고 불가능한 상태를 방지할 수 있습니다.

제네릭은 재사용 가능한 많은 유틸리티 기능과 구성 요소의 핵심이었습니다. 이를 통해 유형 검사를 희생하지 않고도 다양한 데이터 유형으로 작업할 수 있는 유연하고 유형이 안전한 코드를 작성할 수 있었습니다.

데코레이터는 로깅, 유효성 검사, 캐싱과 같은 측면에서 매우 유용했습니다. 저는 이를 사용하여 기본 논리를 어지럽히지 않고 클래스에 교차 문제를 추가하여 더 깔끔하고 유지 관리하기 쉬운 코드를 만들었습니다.

내 경험상 이러한 고급 TypeScript 기능은 함께 사용할 때 정말 빛을 발합니다. 예를 들어, 조건부 유형이 있는 제네릭을 사용하여 유연한 유틸리티 유형을 만들거나, 강력한 상태 관리를 위해 구별된 공용체와 유형 가드를 결합할 수 있습니다.

제가 발견한 특히 강력한 패턴 중 하나는 조건부 유형과 함께 매핑된 유형을 사용하여 고급 유틸리티 유형을 만드는 것입니다. 예는 다음과 같습니다.

interface User {
  id: number;
  name: string;
  email: string;
}

type ReadonlyUser = {
  readonly [K in keyof User]: User[K];
};

const user: ReadonlyUser = {
  id: 1,
  name: "John Doe",
  email: "john@example.com",
};

// This would cause a TypeScript error
// user.name = "Jane Doe";
로그인 후 복사
로그인 후 복사

이 DeepReadonly 유형은 객체(및 중첩 객체)의 모든 속성을 반복적으로 읽기 전용으로 만듭니다. 이는 이러한 고급 기능을 활용할 때 TypeScript의 유형 시스템이 얼마나 강력한지 보여주는 훌륭한 예입니다.

제가 찾은 또 다른 유용 패턴은 제네릭과 구별된 공용체를 결합하여 유형이 안전한 이벤트 시스템을 만드는 것입니다.

function processValue(value: string | number) {
  if (typeof value === "string") {
    // TypeScript knows that 'value' is a string here
    console.log(value.toUpperCase());
  } else {
    // TypeScript knows that 'value' is a number here
    console.log(value.toFixed(2));
  }
}
로그인 후 복사
로그인 후 복사
로그인 후 복사

이 패턴을 사용하면 이벤트가 올바른 페이로드 유형으로 방출되어 런타임 오류를 방지하고 코드 안정성이 향상됩니다.

결론적으로 이러한 고급 TypeScript 기능은 내 개발 툴킷에 없어서는 안 될 도구가 되었습니다. 덕분에 더욱 강력하고 유지 관리가 가능하며 확장 가능한 JavaScript 애플리케이션을 작성할 수 있었습니다. Type Guard, 매핑된 유형, 조건부 유형, 리터럴 유형, 구별된 공용체, 제네릭 및 데코레이터를 활용하여 보다 정확한 유형 정의를 만들고 개발 프로세스 초기에 오류를 포착하며 보다 표현력이 풍부한 코드를 작성할 수 있었습니다.

그러나 큰 힘에는 큰 책임이 따른다는 점을 기억하는 것이 중요합니다. 이러한 기능은 코드를 크게 향상시킬 수 있지만 현명하게 사용하지 않으면 유형 정의가 지나치게 복잡해질 수도 있습니다. 모든 도구와 마찬가지로 중요한 점은 명확한 이점을 제공하고 코드 품질을 향상시키는 곳에 사용하는 것입니다.

모든 JavaScript 개발자가 이러한 고급 TypeScript 기능을 살펴보시기 바랍니다. 처음에는 어려워 보일 수 있지만 연습을 통해 고품질의 형식이 안전한 애플리케이션을 만드는 데 강력한 동맹자가 됩니다. 이러한 기능을 배우고 적용하는 데 투자한 시간은 버그 감소, 코드 가독성 향상, 유지 관리가 용이한 코드베이스라는 형태로 성과를 거둘 것입니다.

TypeScript는 단순히 JavaScript에 유형을 추가하는 것이 아닙니다. 더 좋고 안전한 코드를 작성하기 위해 유형 시스템을 활용하는 것입니다. 이러한 고급 기능은 단순한 구문 설탕이 아니라 애플리케이션 설계 및 구현 방법을 근본적으로 개선할 수 있는 강력한 도구입니다.

JavaScript 생태계가 계속 발전함에 따라 TypeScript와 그 고급 기능이 웹 개발의 미래를 어떻게 형성할지 기대됩니다. 이러한 도구를 숙달함으로써 우리는 미래의 강력하고 확장 가능한 애플리케이션을 구축할 준비가 된 진화의 최전선에 서게 됩니다.


101권

101 Books는 작가 Aarav Joshi가 공동 창립한 AI 기반 출판사입니다. 고급 AI 기술을 활용하여 출판 비용을 믿을 수 없을 정도로 낮게 유지합니다. 일부 도서의 가격은 $4만큼 저렴하여 모든 사람이 양질의 지식에 접근할 수 있습니다.

아마존에서 구할 수 있는 Golang Clean Code 책을 확인해 보세요.

업데이트와 흥미로운 소식을 계속 지켜봐 주시기 바랍니다. 책을 쇼핑할 때 Aarav Joshi를 검색해 더 많은 책을 찾아보세요. 제공된 링크를 이용하여 특별할인을 즐겨보세요!

우리의 창조물

저희 창작물을 꼭 확인해 보세요.

인베스터 센트럴 | 투자자 중앙 스페인어 | 중앙 독일 투자자 | 스마트리빙 | 시대와 메아리 | 수수께끼의 미스터리 | 힌두트바 | 엘리트 개발자 | JS 학교


우리는 중간에 있습니다

테크 코알라 인사이트 | Epochs & Echoes World | 투자자중앙매체 | 수수께끼 미스터리 매체 | 과학과 신기원 매체 | 현대 힌두트바

위 내용은 개발을 강화하는 고급 TypeScript 기능의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿