>웹 프론트엔드 >JS 튜토리얼 >TypeScript 함정: 개발자가 저지르는 주요 실수와 이를 피하는 방법

TypeScript 함정: 개발자가 저지르는 주요 실수와 이를 피하는 방법

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-08 06:38:02784검색

TypeScript Traps: Top Mistakes Developers Make and How to Dodge Them

소개

TypeScript는 코드가 실행되기도 전에 오류를 포착하는 데 도움이 되는 유형 검사와 같은 추가 기능을 JavaScript에 추가하기 때문에 개발자들에게 인기 있는 선택이 되었습니다. 각 변수에 특정 유형이 있는지 확인함으로써 TypeScript는 일반적인 실수를 방지하고 특히 대규모 프로젝트에서 코드를 더 쉽게 이해하고 작업할 수 있도록 도와줍니다.

그러나 사람들이 TypeScript를 배우기 시작하면 종종 몇 가지 일반적인 문제에 직면하게 됩니다. 이러한 실수로 인해 코드를 읽기가 더 어려워지거나 TypeScript가 방지해야 하는 버그가 발생할 수 있습니다. 이러한 실수와 이를 방지하는 방법을 배우면 코드 품질에 큰 차이를 만들 수 있습니다. 더 깔끔하고 안전한 코드를 작성하는 데 도움이 되며 나중에 디버깅 시간을 절약할 수 있습니다. 이 가이드는 가장 일반적인 TypeScript 실수를 안내하고 이를 방지하기 위한 실용적인 팁을 제공합니다.

실수 #1: 유형 단언문의 오용

유형 어설션이란 무엇입니까?

TypeScript에서 유형 어설션은 TypeScript에 "저를 믿으세요. 저는 이 변수가 어떤 유형이어야 하는지 알고 있습니다."라고 알리는 방법입니다. 예를 들어, TypeScript가 어떤 유형인지 확실하지 않은 경우 유형 어설션을 사용하여 해당 항목이 특정 유형으로 작동하도록 할 수 있습니다.

다음은 간단한 예입니다.

let value: any = "Hello, world!";
let stringLength = (value as string).length;

이 경우 TypeScript에 "값이 문자열이라는 것을 알고 있습니다."라고 알려주므로 TypeScript에서는 문자열 기능(예: .length)을 사용할 수 있습니다.

유형 어설션의 일반적인 문제

유형 어설션은 도움이 될 수 있지만 잘못 사용하면 문제를 일으킬 수도 있습니다. TypeScript가 적절한 확인 없이 변수를 특정 유형으로 처리하도록 실행하면 코드에 오류가 발생할 수 있습니다. 특히 유형이 실제로 생각한 것과 다른 경우에는 더욱 그렇습니다.

예:

let value: any = 42;
let stringLength = (value as string).length; // This will throw an error at runtime

여기서는 TypeScript에 값이 문자열이라고 알려주고 있지만 실제로는 숫자입니다. TypeScript에서는 오류가 표시되지 않지만 실제로 코드가 실행될 때 문제가 발생하여 예상치 못한 런타임 오류가 발생합니다.

유형 어설션을 과도하게 사용하는 것이 위험할 수 있는 이유

유형 어설션을 과도하게 사용하면 TypeScript의 오류 포착 기능이 일부 손실되기 때문에 문제가 발생할 수 있습니다. 유형 주장은 TypeScript에 실제로 어떤 유형이 있는지 "무시"하도록 지시하며, 이는 처음에 TypeScript를 사용하는 목적을 무산시킬 수 있습니다. TypeScript는 오류를 잡는 데 도움이 되지만 계속해서 유형을 주장하면 문제를 놓치고 버그가 빠져나갈 수 있습니다.

이 실수를 피하는 방법

  1. 가능한 경우 유형 추론 사용: TypeScript는 종종 자체적으로 유형을 알아낼 수 있습니다. 어설션을 사용하는 대신 TypeScript가 가능한 경우 유형을 추론하도록 하세요.

  2. 불필요한 any 사용 피하기: any 유형은 유형 어설션을 사용하고 싶은 유혹을 줄 수 있지만 any 유형은 유형 안전성을 제거합니다. 대신 특정 유형을 사용하면 어설션의 필요성이 줄어듭니다.

  3. 유형 어설션 전에 검사 추가: 유형이 확실하지 않으면 먼저 확인하세요. 예:

let value: any = "Hello, world!";
let stringLength = (value as string).length;
  1. any 대신에 알 수 없음 사용: TypeScript에서는 사용하기 전에 유형을 확인해야 안전하지 않은 어설션을 피할 수 있으므로 알 수 없는 유형이 어떤 유형보다 안전합니다.

유형 어설션은 유용한 도구일 수 있지만 신중하고 아껴서 사용해야 합니다. 이러한 모범 사례를 따르면 TypeScript 코드의 안정성을 높이고 런타임 오류 위험을 줄일 수 있습니다.

실수 #2: any 유형을 과도하게 사용

어떤 유형이 있나요?

TypeScript에서 any 유형은 TypeScript에 "이게 어떤 유형인지 모르거나 관심이 없습니다."라고 알리는 방법입니다. 변수 유형을 any로 설정하면 TypeScript는 해당 변수 유형 확인을 중지합니다. 이는 TypeScript에서 오류를 발생시키지 않고 문자열, 숫자, 객체 등을 사용하여 거의 모든 작업을 수행할 수 있음을 의미합니다.

예:

let value: any = 42;
let stringLength = (value as string).length; // This will throw an error at runtime

왜 문제가 발생할 수 있습니까?

어떤 것이든 도움이 될 수 있지만 TypeScript의 안전 기능을 끄기하므로 문제가 발생할 수 있습니다. TypeScript의 요점은 올바른 유형을 사용하여 오류를 잡는 데 도움을 주는 것입니다. 그러나 어떤 것을 사용하더라도 TypeScript는 해당 변수에 오류가 있는지 확인할 수 없으므로 버그가 발생할 수 있습니다.

예:

   let value: any = 42;
   if (typeof value === 'string') {
       let stringLength = (value as string).length;
   }

이 경우 값은 임의이므로 TypeScript에서는 값이 숫자인 경우에도 value.toUpperCase()를 허용하므로 코드를 실행하려고 하면 오류가 발생합니다.

개발자가 any를 사용하는 일반적인 이유

  1. 빠른 수정: 때때로 개발자는 오류를 빨리 없애기 위해 유형을 any로 설정합니다.
  2. 불확실한 유형: 데이터 유형이 명확하지 않은 경우 개발자는 올바른 유형을 찾는 대신 데이터 유형을 사용할 수 있습니다.
  3. 복잡한 데이터: 여러 속성이 포함된 API 응답과 같이 데이터가 복잡한 경우 개발자는 구조를 입력하지 않기 위해 아무거나 사용할 수 있습니다.

이러한 경우에는 어떤 방법을 사용하는 것이 쉬워 보일 수도 있지만 장기적으로는 더 큰 문제를 일으키는 경우가 많습니다.

남용을 피하는 방법

  1. any 대신에 알 수 없음을 사용하세요: 알 수 없는 유형은 사용하기 전에 유형을 확인해야 하므로 더 안전합니다. 알 수 없음을 사용하면 TypeScript는 변수를 사용하기 전에 변수가 특정 유형인지 확인하도록 강제합니다.
let value: any = "Hello, world!";
let stringLength = (value as string).length;
  1. 특정 유형 정의: 각 변수에 대해 정확한 유형을 정의해 보세요. 예를 들어 값이 항상 문자열이라는 것을 알고 있다면 any 대신 string을 사용하세요.
let value: any = 42;
let stringLength = (value as string).length; // This will throw an error at runtime
  1. 복잡한 데이터에 인터페이스 사용: 객체나 복잡한 데이터의 경우 구조를 설명하는 인터페이스를 만듭니다. 이런 방식으로 TypeScript는 각 속성을 확인하고 데이터가 예상한 것과 일치하는지 확인할 수 있습니다.
   let value: any = 42;
   if (typeof value === 'string') {
       let stringLength = (value as string).length;
   }
  1. 최후의 수단으로만 사용: 반드시 사용해야 하는 경우 코드의 작은 부분으로 제한하고 필요한 이유를 설명하는 주석을 추가하세요.

알 수 없는 유형이나 특정 유형을 피하고 사용하면 코드를 더 안전하게 만들고 예기치 않은 오류의 위험을 줄여 TypeScript 코드를 더 강력하고 안정적으로 만들 수 있습니다.

실수 #3: 무엇이든 알 수 없음을 혼동함

어떤 것과 알려지지 않은 것의 차이점은 무엇입니까?

TypeScript에서 any와known은 모두 변수의 정확한 유형을 확신할 수 없을 때 사용할 수 있는 유형입니다. 하지만 중요한 차이점이 있습니다.

  • any: 유형 검사 없이 변수로 무엇이든 할 수 있습니다. 이는 본질적으로 TypeScript의 안전 기능을 끕니다.
  • 알 수 없음: 특정 방식으로 변수를 사용하기 전에 유형을 확인해야 합니다. TypeScript는 해당 유형을 확인할 때까지 의미가 없는 방식으로 사용하는 것을 방지하므로 더 안전한 옵션입니다.

알려지지 않은 것이 종종 더 안전한 이유

알 수 없음을 사용하면 변수를 사용하기 전에 유형을 확인해야하므로 일반적으로 그 어떤 것보다 안전합니다. 이는 작업 중인 유형이 확실하지 않을 때 발생할 수 있는 오류를 방지하는 데 도움이 됩니다.

예를 들어, 변수를 사용하여 작업하는데 그것이 문자열인지 숫자인지 모른다고 가정해 보세요.

let value: any = "Hello!";
value = 42; // No problem, even though it started as a string.

여기서 값을 알 수 없으므로 TypeScript에서는 값이 문자열인지 확인할 때까지 value.toUpperCase()를 사용할 수 없습니다. 유형 검사 없이 toUpperCase()를 사용하려고 하면 TypeScript에서 오류를 표시하여 런타임 버그를 방지하는 데 도움이 됩니다.

반면에,

let value: any = "Hello!";
console.log(value.toUpperCase()); // This is fine
value = 42;
console.log(value.toUpperCase()); // TypeScript won’t catch this, but it will cause an error at runtime

나중에 값이 숫자가 되면 이 코드는 실행 시 오류를 발생시키고 TypeScript는 이에 대해 경고하지 않습니다. 알 수 없음을 사용하면 먼저 유형 확인을 요구하여 이 문제를 방지하는 데 도움이 됩니다.

임의와 알 수 없음 중에서 선택하는 방법

  1. 유형이 불확실할 때 알 수 없음 사용: 변수에 어떤 유형이 있는지 모르고 사용하기 전에 확인해야 하는 경우 알 수 없음을 사용하세요. TypeScript는 특정 작업을 수행하기 전에 유형을 확인하므로 더 안전합니다.

  2. 가능한 경우 피하세요: TypeScript의 유형 검사를 제거하므로 모두 최후의 수단으로 사용해야 합니다. 유형을 전혀 확인할 필요가 없고 실제로는 중요하지 않은 경우에만 any를 사용하세요.

  3. 알 수 없는 유형 검사 추가: 알 수 없음을 사용할 때마다 사용하기 전에 검사를 추가하는 것을 잊지 마세요. 이렇게 하면 TypeScript의 안전 기능이 활성 상태로 유지되고 예상치 못한 버그를 방지하는 데 도움이 됩니다.

  4. 특정 유형 선호: 유형이 무엇인지 알고 있다면 any 또는 알 수 없음 대신 해당 유형을 사용하세요. 이렇게 하면 코드를 더욱 예측 가능하고 이해하기 쉽게 만들 수 있습니다.

알 수 없음을 사용하면 코드를 더 안전하게 유지하고 어떤 경우에도 발생할 수 있는 오류를 방지할 수 있습니다. 작업 중인 데이터 유형을 항상 아는 등 좋은 습관을 장려하므로 더욱 안정적인 TypeScript 코드를 작성할 수 있습니다.

실수 #4: Null 및 정의되지 않은 값 무시

TypeScript의 Null 및 정의되지 않음 이해

TypeScript에서 null정의되지 않음은 "비어 있음" 또는 "설정되지 않음" 값을 나타냅니다.

  • null은 양식의 필드를 의도적으로 비워 두는 경우와 같이 의도적으로 값이 없는 경우에 사용됩니다.
  • 정의되지 않음은 변수가 생성되었지만 값이 지정되지 않은 경우와 같이 값이 아직 할당되지 않았음을 의미합니다.

이러한 "빈" 값을 무시하면 null이거나 정의되지 않은 변수를 사용하려고 할 때 오류가 발생할 수 있습니다.

Null 및 정의되지 않은 일반적인 오류

TypeScript가 null 또는 정의되지 않음을 고려하지 않는 경우 값이 있는 것처럼 변수를 사용하려고 시도했지만 값이 없는 것을 발견할 수 있습니다. 이로 인해 런타임 오류(코드가 실행될 때 발생하는 오류)가 발생할 수 있습니다.

예:

let value: any = "Hello, world!";
let stringLength = (value as string).length;

여기서 user는 null이므로 user.name에 액세스하려고 하면 오류가 발생합니다. 값이 null이거나 정의되지 않은 경우를 처리하지 않으면 코드가 예기치 않게 중단될 수 있습니다.

이 실수를 피하는 방법

  1. 옵션 체인 사용(?.): 옵션 체인은 객체가 null이거나 정의되지 않은 경우에도 속성에 안전하게 액세스하는 데 도움이 되는 TypeScript의 기능입니다. ?.를 사용하면 TypeScript는 속성에 액세스하기 전에 객체가 존재하는지 확인합니다. 그렇지 않으면 오류를 발생시키는 대신 정의되지 않은 값을 반환합니다.
let value: any = "Hello, world!";
let stringLength = (value as string).length;
  1. Non-Null Assertion(!): 때로는 코드의 특정 지점에서 값이 null이 아니거나 정의되지 않은 것이 확실하지만 TypeScript는 확실하지 않은 경우가 있습니다. null이 아닌 어설션(!)을 사용하여 TypeScript에 "이 값은 null이 아니거나 정의되지 않은 것으로 알고 있습니다."라고 알릴 수 있습니다. 그러나 값이 null로 판명되면 여전히 오류가 발생하므로 이 방법을 주의해서 사용하세요.
let value: any = 42;
let stringLength = (value as string).length; // This will throw an error at runtime
  1. 엄격한 Null 검사 활성화: TypeScript의 strictNullChecks 설정은 null 및 정의되지 않은 사례를 처리하는 데 도움이 됩니다. 이 옵션이 켜져 있으면 TypeScript에서는 먼저 확인하지 않고는 null이거나 정의되지 않은 변수를 사용할 수 없으므로 오류를 조기에 포착하는 데 도움이 됩니다.

엄격한 null 검사를 활성화하려면 tsconfig.json 파일에 "strictNullChecks": true를 추가하면 됩니다. 이런 방식으로 TypeScript는 null과 undefine을 적절하게 처리하도록 요구하여 코드를 더욱 안전하게 만듭니다.

null 및 정의되지 않은 값을 올바르게 처리하면 버그를 방지하고 빈 값이 발견될 때 코드가 중단되는 것을 방지할 수 있습니다. 선택적 연결, null이 아닌 어설션 및 엄격한 null 검사를 사용하면 TypeScript 코드를 더욱 안정적이고 작업하기 쉽게 만들 수 있습니다.

실수 #5: 유형 주석을 잘못 사용함

유형 주석이란 무엇입니까?

유형 주석은 변수, 함수 또는 매개변수가 어떤 유형을 가져야 하는지 TypeScript에 알려줄 때 사용됩니다. 예를 들어, 변수가 항상 숫자라는 것을 알고 있다면 다음과 같이 쓸 수 있습니다.

   let value: any = 42;
   if (typeof value === 'string') {
       let stringLength = (value as string).length;
   }

나이는 숫자에 불과하다는 사실이 분명해졌습니다. TypeScript는 age를 문자열과 같은 다른 유형으로 사용하려는 경우 실수를 잡기 위해 이 정보를 사용합니다.

유형 주석의 일반적인 실수

때때로 사람들은 다음과 같은 유형 주석에 실수를 범합니다.

  1. 잘못된 유형 지정: 예를 들어 실제로는 숫자인데 문자열이라고 말하는 경우입니다. 이로 인해 오류와 혼란이 발생할 수 있습니다.
let value: any = "Hello, world!";
let stringLength = (value as string).length;
  1. 과대 주석: TypeScript가 이미 유형을 알고 있는 경우에도 모든 곳에 유형 ​​주석을 추가하는 경우입니다. TypeScript는 많은 경우 자체적으로 유형을 파악할 수 있을 만큼 똑똑하므로 추가 주석이 항상 필요한 것은 아닙니다. 유형 주석을 너무 많이 추가하면 코드가 복잡해 보이고 읽기 어려워질 수 있습니다.
let value: any = 42;
let stringLength = (value as string).length; // This will throw an error at runtime

유형 주석을 과도하게 사용하면 혼란스러울 수 있는 이유

주석을 과도하게 사용하면 코드가 반복적이고 혼란스러워 보일 수 있습니다. TypeScript는 해당 값을 기반으로 변수 유형을 자동으로 "추론"(파악)합니다. 따라서 TypeScript가 올바르게 추측할 수 있으면 매번 유형을 작성할 필요가 없습니다.

예를 들어 다음 코드는 다음과 같습니다.

   let value: any = 42;
   if (typeof value === 'string') {
       let stringLength = (value as string).length;
   }

TypeScript는 이미 isComplete가 부울임을 이해하고 있으므로 : boolean을 추가할 필요가 없습니다.

유형 주석의 잘못된 사용을 방지하는 방법

  1. 가능한 경우 TypeScript에서 유형을 추론하도록 허용: 변수에 직접 값을 할당하는 경우 유형 주석을 건너뛸 수 있습니다. TypeScript는 값을 기반으로 유형을 자동으로 감지합니다.
let value: any = "Hello!";
value = 42; // No problem, even though it started as a string.
  1. 필요할 때만 주석 사용: 함수 매개변수나 복잡한 객체와 같이 TypeScript가 자체적으로 유형을 추론할 수 없는 경우 유형 주석을 추가합니다.
let value: any = "Hello!";
console.log(value.toUpperCase()); // This is fine
value = 42;
console.log(value.toUpperCase()); // TypeScript won’t catch this, but it will cause an error at runtime
  1. 유형 정확성 확인: 유형 주석을 추가하는 경우 올바른지 확인하세요. 실제로 숫자인데 문자열이라고 부르는 것과 같은 불일치를 피하기 위해 유형이 사용되는 실제 값과 일치하는지 다시 확인하세요.

TypeScript가 가능한 경우 유형을 처리하도록 하고 필요한 경우에만 명확한 주석을 추가하면 코드가 더 깔끔하고 읽기 쉽고 오류가 발생할 가능성이 줄어듭니다. 이렇게 하면 TypeScript 코드가 단순하고 이해하기 쉬워집니다!

실수 #6: 구조적 유형 지정을 잊어버림

구조적 타이핑이란 무엇입니까?

TypeScript는 구조적 타이핑이라는 것을 사용합니다. 이는 TypeScript가 유형이 무엇인지에 초점을 맞추기보다는 객체의 모양이나 구조에 관심을 기울여 특정 유형과 호환되는지 결정한다는 것을 의미합니다.

즉, 두 객체의 속성과 유형이 동일한 경우 TypeScript는 이름이 다르더라도 이를 동일한 것으로 간주합니다.

예:

   let value: unknown = "Hello!";
   if (typeof value === "string") {
       console.log(value.toUpperCase());
   }

여기서 coordinate와 anotherCoordinate는 동일한 구조를 가지므로 TypeScript는 이를 호환 가능한 것으로 간주합니다. TypeScript는 anotherCoordinate가 Point로 호출되지 않아도 상관하지 않습니다. 숫자 유형의 x 및 y 속성이 있는지만 확인합니다.

구조적 타이핑의 일반적인 실수

일반적인 실수는 TypeScript가 명목형 타이핑(이름 기반 유형)을 사용한다고 가정하는 것입니다. 명목형 입력에서는 두 가지가 호환되려면 이름이 완전히 동일한 유형이어야 합니다. 하지만 TypeScript의 구조 시스템에서는 모양이 일치하면 TypeScript는 이를 동일한 유형으로 처리합니다.

예를 들어 개발자는 Point 유형의 객체만 좌표에 할당할 수 있다고 생각할 수 있습니다. 그러나 TypeScript는 유형 이름에 관계없이 동일한 구조를 가진 모든 객체를 허용합니다. 구조적 유형 지정을 처음 사용하는 경우 코드의 서로 다른 부분에서 모양이 일치하는 객체를 동일한 유형으로 간주할 수 있으므로 혼란스러울 수 있습니다.

구조적 타이핑으로 실수를 피하는 방법

  1. 모양 기반 접근 방식 이해: TypeScript는 이름보다 구조(속성 및 유형)에 더 관심을 갖는다는 점을 기억하세요. 유형 이름보다는 객체가 갖는 속성에 중점을 둡니다.

  2. 추가 속성에 주의하세요: 개체에 추가 속성을 추가하는 경우 경우에 따라 여전히 예상 유형과 일치할 수 있습니다. 혼란을 피하기 위해 객체가 특정 유형에 필요한 속성만 가지고 있는지 확인하세요.

  3. 인터페이스 및 유형 별칭을 사용하여 구조 적용: TypeScript가 구조적 유형 지정에 유연하더라도 인터페이스 또는 유형 별칭을 생성하면 정의하는 데 도움이 될 수 있습니다. 구조를 명확하게 하고 의도한 모양을 다른 개발자에게 전달합니다. 이렇게 하면 코드를 더 쉽게 이해할 수 있습니다.

let value: any = "Hello, world!";
let stringLength = (value as string).length;
  1. 필요할 때 유형 검사에 의존: TypeScript의 구조적 유형 지정은 유연성 측면에서 매우 강력하지만 구조가 일치하는 객체가 어떻게 상호 작용하는지 아는 것이 여전히 중요합니다. 좀 더 엄격하게 하고 싶다면 각 유형이 고유한지 확인하는 클래스나 기술을 사용할 수 있습니다.

TypeScript의 구조적 타이핑 시스템은 유연성을 제공하지만 예상치 못한 상황을 피하기 위해 작동 방식을 이해하는 것이 중요합니다. 유형의 모양에 중점을 두고 인터페이스나 유형 별칭을 사용하면 코드를 명확하고 안정적으로 유지하면서 이 시스템을 최대한 활용할 수 있습니다.

실수 #7: 객체 모양을 잘못 정의함

객체 모양 정의가 중요한 이유

TypeScript에서는 객체를 생성할 때 객체가 갖는 속성과 각 속성의 유형을 정의해야 합니다. 이것을 물체의 모양 정의라고 합니다. 모양이 제대로 정의되지 않으면 런타임 오류가 발생할 수 있습니다. 이러한 오류는 코드를 실행할 때 발생합니다.

예를 들어, 객체에 이름과 나이가 있어야 한다고 했는데 나이를 추가하는 것을 잊은 경우 TypeScript에서 특정 경우에 해당 객체가 슬라이드되도록 허용할 수 있지만 나중에 나이를 사용하려고 하면 코드가 깨질 수 있습니다.

실제 사례

이름과 나이가 있어야 하는 사용자 개체를 정의한다고 가정해 보겠습니다.

let value: any = "Hello, world!";
let stringLength = (value as string).length;

이제 사용자를 생성했지만 연령을 추가하는 것을 잊어버리면 문제가 발생할 수 있습니다.

let value: any = 42;
let stringLength = (value as string).length; // This will throw an error at runtime

이것은 단순한 실수이지만 나이가 항상 있을 것으로 기대한다면 문제가 발생할 수 있습니다. 개체 모양을 올바르게 정의하지 않으면 중요한 속성을 실수로 건너뛰어 해당 속성에 액세스하려고 할 때 오류가 발생할 수 있습니다.

이 실수를 피하는 방법

  1. 인터페이스 및 유형 별칭 사용: TypeScript의 인터페이스 또는 유형 별칭을 사용하여 개체의 구조를 명확하게 정의하세요. 이렇게 하면 객체를 생성할 때마다 모든 필수 필드가 제자리에 있는지 확인할 수 있습니다.
   let value: any = 42;
   if (typeof value === 'string') {
       let stringLength = (value as string).length;
   }
  1. 필요할 때 선택적 속성 사용: 속성이 항상 필수가 아닌 경우 ?를 사용하여 해당 속성을 선택 사항으로 표시할 수 있습니다. 이렇게 하면 TypeScript는 이를 생략해도 불평하지 않지만 여전히 다른 필수 필드를 확인합니다.
let value: any = "Hello!";
value = 42; // No problem, even though it started as a string.
  1. 유틸리티 유형 활용: TypeScript에는 유연한 모양을 지원하는 Partial과 같은 유틸리티 유형이 내장되어 있습니다. 예를 들어 개체의 일부만 업데이트하는 경우 Partial 속성을 생략할 수 있도록 합니다.
let value: any = "Hello!";
console.log(value.toUpperCase()); // This is fine
value = 42;
console.log(value.toUpperCase()); // TypeScript won’t catch this, but it will cause an error at runtime
  1. 필수 속성을 다시 확인하세요: 객체를 정의하거나 사용할 때 객체에 필요한 필드가 모두 있는지 항상 확인하세요. 필수 속성이 누락되면 문제가 발생할 수 있으므로 개체가 정의된 모양과 일치하는지 확인하는 것이 좋습니다.

객체 모양을 신중하게 정의하면 각 객체에 필수 필드가 포함되도록 하여 코드의 신뢰성을 높이고 오류 위험을 줄일 수 있습니다. 인터페이스, 선택적 속성, 유틸리티 유형과 같은 TypeScript 도구를 사용하면 모양을 정확하게 정의하고 코드를 더 쉽게 유지 관리할 수 있습니다.

실수 #8: 열거형을 과도하게 사용

열거형이란 무엇입니까?

TypeScript에서 열거형은 명명된 값 집합을 정의하는 방법입니다. 이를 통해 관련 값을 단일 이름으로 그룹화할 수 있습니다. 예:

   let value: unknown = "Hello!";
   if (typeof value === "string") {
       console.log(value.toUpperCase());
   }

열거형은 작업 상태와 같이 제한된 값 집합을 나타내야 할 때 유용합니다. 그러나 때로는 열거형을 과도하게 사용하면 코드가 필요 이상으로 복잡해질 수 있습니다.

열거형을 과도하게 사용하는 것이 문제가 될 수 있는 이유

  1. 코드를 읽기 어렵게 만듭니다: 열거형을 사용할 때 열거형 값의 이름을 기억해야 하므로 불필요한 복잡성이 추가될 수 있습니다. 예를 들어:
   let value: string = "Hello!";

괜찮아 보이지만, 어디에서나 열거형을 사용하면 특히 열거형 정의에 익숙하지 않은 개발자의 경우 코드를 빨리 이해하기가 더 어려워질 수 있습니다.

  1. 코드 유지 관리 증가: 코드 전체에 열거형을 사용하면 나중에 값을 업데이트하거나 변경하는 것이 더 어려울 수 있습니다. 여러 위치에서 열거형을 검색하고 업데이트해야 하므로 추가 작업이 필요할 수 있습니다.

  2. 불필요한 추상화: 때때로 열거형은 필요하지 않은 추상화 수준을 추가합니다. 예를 들어 간단한 문자열이나 숫자는 열거형 없이도 작업을 수행할 수 있습니다.

열거형의 남용을 방지하는 방법

  1. 대신 공용체 유형 사용: 작은 값 집합만 필요한 경우 열거형 대신 공용체 유형을 사용하는 것이 좋습니다. Union 유형은 더 간단하고 유지 관리가 더 쉽습니다.
let value: any = "Hello, world!";
let stringLength = (value as string).length;

여기서 Status는 단지 가능한 값의 집합입니다. 열거형보다 간단하면서도 여전히 유형 안전성을 제공합니다.

  1. 간단한 경우에는 문자열 리터럴 사용: 값이 단순 문자열인 경우 열거형 대신 문자열 리터럴을 사용하세요. 예를 들어:
let value: any = 42;
let stringLength = (value as string).length; // This will throw an error at runtime

이렇게 하면 전체 열거형을 만들 필요 없이 간단하고 명확하게 유지됩니다.

  1. 특정 사례에 대해 열거형을 고수하세요: 열거형은 열거형에 메서드를 추가하는 등 더 복잡한 것을 나타내야 하거나 값이 더 설명적이어야 할 때 유용합니다. 예를 들어, 추가 기능이 필요한 상태 코드 세트로 작업하는 경우 열거형이 적합할 수 있습니다. 그러나 단순한 값 집합의 경우에는 피하는 것이 좋습니다.

열거형을 사용해야 하는 경우

Enum은 다음과 같은 경우에 적합합니다.

  • 코드의 여러 위치에서 사용될 관련 값의 명명된 컬렉션이 필요합니다.
  • 값과 관련된 추가 기능(예: 메서드 또는 계산된 속성)이 필요합니다.

그러나 단순한 값 집합의 경우 공용체 유형이나 문자열 리터럴을 사용하는 것이 더 좋고 간단한 솔루션인 경우가 많습니다.

열거형의 남용을 방지하면 코드를 더 쉽게 읽고, 유지 관리하고, 이해할 수 있어 코드가 더욱 깔끔하고 효율적으로 만들어집니다.

실수 #9: 제네릭에 대한 오해

제네릭이란 무엇입니까?

TypeScript의 제네릭은 유형 안전성을 유지하면서 모든 유형에서 작동할 수 있는 재사용 가능한 코드를 생성하는 방법입니다. 이를 통해 TypeScript 유형 검사의 이점을 잃지 않고 다양한 유형과 함께 작동할 수 있는 함수, 클래스 또는 인터페이스를 작성할 수 있습니다.

예:

   let value: any = 42;
   if (typeof value === 'string') {
       let stringLength = (value as string).length;
   }

이 경우 T는 함수 호출 시 결정되는 유형에 대한 자리 표시자입니다. 문자열, 숫자 등 모든 유형을 전달할 수 있으며 TypeScript는 유형이 일치하는지 확인합니다.

제네릭의 일반적인 실수

  1. 잘못된 유형 제약 조건: 때때로 개발자는 제네릭에 제약 조건을 추가하려고 시도하지만 실수를 저지르는 경우가 있습니다. 예를 들어, 너무 제한적이거나 작업 중인 함수나 클래스에 적합하지 않은 제약 조건을 사용하려고 할 수 있습니다.
let value: any = "Hello, world!";
let stringLength = (value as string).length;

여기서 T는 문자열로 제한되며 이는 길이 속성에 적합합니다. 그러나 불필요하거나 잘못된 제약 조건을 사용하면 다른 유형에 대한 함수가 중단될 수 있습니다.

  1. 과도하게 복잡한 코드: 제네릭을 부정확하거나 불필요하게 사용하면 코드가 필요 이상으로 복잡해질 수 있습니다. 예를 들어, 더 간단한 솔루션이 잘 작동하는 일반 유형이나 함수를 만들 수 있습니다.
let value: any = 42;
let stringLength = (value as string).length; // This will throw an error at runtime

이 함수는 임의 유형의 두 값을 결합하기 때문에 일반 함수일 필요는 없습니다. 제네릭을 사용하지 않고도 이를 단순화할 수 있습니다.

제네릭에 대한 오해를 피하는 방법

  1. 필요할 때만 제네릭을 사용하세요: 제네릭이 항상 필요한 것은 아닙니다. 코드가 다른 유형과 작동할 필요가 없다면 특정 유형을 사용하는 것이 더 좋습니다. 제네릭은 강력하지만 가치를 더할 때만 사용해야 합니다.

  2. 유형 제약 조건 이해: 제네릭을 사용할 때는 제약 조건이 맞는지 확인하세요. 제한해야 하는 유형만 제한하세요. 예를 들어, 배열로 작업하는 경우 T[] 또는 Array 제약으로.

   let value: any = 42;
   if (typeof value === 'string') {
       let stringLength = (value as string).length;
   }
  1. 가능한 경우 단순화: 불필요한 제네릭으로 코드를 지나치게 복잡하게 만들지 마세요. 간단한 유형(문자열이나 숫자 등)이 잘 작동한다면 제네릭으로 일반화하려고 하지 마세요. 함수나 클래스를 다양한 유형으로 유연하게 만들려면 제네릭을 사용하세요.

  2. 기본 제네릭 사용: 제네릭을 더 쉽게 사용하려면 사용자가 제공하지 않는 경우 기본 유형을 할당할 수 있습니다.

let value: any = "Hello!";
value = 42; // No problem, even though it started as a string.

여기서 사용자가 유형을 지정하지 않으면 T는 기본적으로 문자열로 설정됩니다.

주요 시사점

  • 제네릭은 재사용 가능하고 유연한 코드에 적합하지만 올바르게 사용하지 않으면 혼란스러울 수 있습니다.
  • 유형 제약에 주의하세요. 유형을 너무 많이 또는 잘못 제한하지 마세요.
  • 코드에 가치를 더할 때만 제네릭을 사용하세요. 단순한 유형이면 충분할 때가 많습니다.

제네릭의 작동 방식과 사용 시기를 이해하면 일반적인 실수를 방지하고 코드를 더욱 유연하고 읽기 쉽고 유지 관리하기 쉽게 만들 수 있습니다.

실수 #10: TypeScript 구성 옵션 무시

TypeScript 구성 옵션이란 무엇입니까?

TypeScript에는 tsconfig.json이라는 구성 파일이 있는데, 여기서 다양한 옵션을 설정하여 TypeScript가 코드를 컴파일하는 방법을 사용자 정의할 수 있습니다. 이 구성을 사용하면 더 엄격한 규칙을 적용하고 코드에 문제가 발생하기 전에 잠재적인 오류를 조기에 포착할 수 있습니다.

구성 무시가 문제가 될 수 있는 이유

TypeScript 구성에 주의를 기울이지 않으면 코드의 버그나 문제로 이어질 수 있는 특정 오류나 문제를 포착하지 못할 수도 있습니다. 예를 들어, TypeScript를 사용하면 올바른 설정이 활성화된 경우 일반적으로 잘못된 것으로 표시되는 코드를 작성할 수 있습니다.

이러한 설정을 무시하면 중요한 경고를 놓치고 코드의 안전성이 낮아질 수 있습니다.

알아야 할 주요 TypeScript 구성 옵션

  1. strict: 이는 여러 가지 중요한 엄격한 검사를 한 번에 활성화하는 특별한 설정입니다. 이는 코드가 유형에 안전하고 느슨하거나 약한 유형의 유형에 의존하지 않도록 하는 데 도움이 됩니다.

중요한 이유: strict가 활성화되면 TypeScript는 초기화되지 않은 변수, null 검사 등과 같은 항목을 확인합니다. 이렇게 하면 잠재적인 문제를 조기에 발견하는 데 도움이 됩니다.

let value: any = "Hello, world!";
let stringLength = (value as string).length;
  1. noImplicitAny: 이 설정은 TypeScript가 명시적으로 선언하지 않는 한 변수, 매개변수 또는 반환 값을 any로 입력하는 것을 방지합니다. any를 사용하면 TypeScript의 유형 검사 시스템을 우회하여 모든 값을 할당할 수 있습니다.

중요한 이유: noImplicitAny를 사용하면 TypeScript에서 유형을 지정하도록 강제하여 실수로 유형 검사를 통해 발견할 수 있는 잠재적인 버그를 사용하거나 누락되는 것을 방지합니다.

let value: any = 42;
let stringLength = (value as string).length; // This will throw an error at runtime
  1. strictNullChecks: 이 설정을 활성화하면 명시적으로 지정하지 않는 한 null 및 undef가 모든 유형에 대해 유효한 값으로 처리되지 않도록 합니다. 실수로 null 또는 정의되지 않음을 사용하려고 하여 발생할 수 있는 버그를 방지하는 데 도움이 됩니다.

중요한 이유: 이 설정이 없으면 TypeScript에서는 모든 변수에 null 및 정의되지 않음을 할당할 수 있으므로 런타임 오류가 발생할 수 있습니다.

   let value: any = 42;
   if (typeof value === 'string') {
       let stringLength = (value as string).length;
   }

이 실수를 피하는 방법

  1. 엄격 모드 활성화: tsconfig.json에서 항상 엄격한 플래그를 활성화하세요. 그러면 noImplicitAny 및 strictNullChecks를 포함한 몇 가지 유용한 설정이 자동으로 활성화됩니다. 이는 코드가 최대한 안전하고 오류가 없는지 확인하는 가장 좋은 방법 중 하나입니다.

  2. 설정 검토 및 사용자 정의: 잠시 시간을 내어 TypeScript 컴파일러 옵션의 전체 목록을 검토하세요. 프로젝트의 요구 사항에 맞게 사용자 정의하세요. 특정 검사를 활성화하거나 비활성화하여 코드를 더욱 안정적이고 유지 관리하기 쉽게 만들 수 있습니다.

  3. 항상 noImplicitAny 활성화: 꼭 필요한 경우가 아니면 any 유형을 피하세요. noImplicitAny를 활성화하면 변수 유형에 대해 생각하게 되므로 코드가 더 안전해집니다.

  4. strictNullChecks를 사용하여 Null 오류 잡기: Null 값은 주의 깊게 처리하지 않으면 버그가 쉽게 발생할 수 있습니다. strictNullChecks를 활성화하면 null 또는 정의되지 않은 항목이 문제를 일으킬 수 있는 위치로 미끄러지는 것을 방지할 수 있습니다.

주요 시사점

  • TypeScript의 컴파일러 옵션은 오류가 발생하기 전에 이를 포착하는 데 도움이 되는 강력한 도구입니다.
  • TypeScript의 유형 시스템을 최대한 활용하려면 항상 엄격 모드를 활성화하세요.
  • noImplicitAnystrictNullChecks 옵션을 사용하면 유형이 지정되지 않은 변수 및 null 값과 관련된 버그를 잡을 수 있습니다.

TypeScript 설정을 올바르게 구성하면 일반적인 함정을 피하고 코드를 더욱 안정적이고 유지 관리하기 쉽게 만들 수 있으며 버그 발생 가능성을 줄일 수 있습니다.

결론

TypeScript는 개발자가 더욱 안전하고 안정적인 코드를 작성하는 데 도움을 줄 수 있는 강력한 도구이지만, 이제 막 시작하는 경우에는 실수를 저지르기 쉽습니다. 우리는 유형 어설션 오용, any 남용, null 허용 여부 무시, 제네릭 오해 등 가장 일반적인 TypeScript 함정을 다뤘습니다. 이러한 실수로 인해 예상치 못한 버그가 발생하고 코드 유지 관리가 어려워질 수 있습니다.

다음은 이러한 실수를 방지하기 위한 간단한 체크리스트입니다.

  • 유형 어설션을 오용하지 마세요: 유형이 확실할 때만 사용하세요.
  • 너무 많이 사용하지 마세요: 대신 알 수 없거나 더 구체적인 유형을 사용해 보세요.
  • 모든 것과 알 수 없는 것의 차이점을 이해하세요: 알 수 없는 것이 더 안전하며 사용하기 전에 유형을 확인해야 합니다.
  • null 및 정의되지 않음을 올바르게 처리: 선택적 연결, null이 아닌 어설션을 사용하고 엄격한 null 검사를 활성화합니다.
  • 열거형을 과도하게 사용하지 마세요: 가능하다면 공용체 유형이나 문자열 리터럴을 대신 사용하세요.
  • 제네릭을 올바르게 사용: 상황을 지나치게 복잡하게 만들지 말고 올바른 방식으로 적용하는 방법을 이해하세요.
  • TypeScript를 올바르게 구성: 엄격한 설정을 활성화하여 문제를 조기에 발견하세요.

이러한 일반적인 실수를 이해하고 이 문서에 설명된 모범 사례를 따르면 더 깔끔하고 안전하며 유지 관리가 쉬운 TypeScript 코드를 작성할 수 있습니다.

TypeScript의 기능을 활용하면 더 적은 버그로 더욱 안정적인 애플리케이션을 작성할 수 있습니다. 계속해서 배우고 즐거운 코딩을 즐겨보세요!

위 내용은 TypeScript 함정: 개발자가 저지르는 주요 실수와 이를 피하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.