프로그래밍풀스택 개발자

TypeScript에서 type casting(타입 변환) 메커니즘은 어떻게 작동합니까? 하나의 타입을 다른 타입으로 변환하기 위한 구문은 무엇이며, 타입 변환을 사용할 때의 위험과 제한 사항은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

문제의 역사:

TypeScript는 정적 타입 지정을 구현하므로 때때로 하나의 타입을 다른 타입으로 명시적으로 변환할 필요가 있습니다. 예를 들어, 개발자가 데이터 구조를 컴파일러보다 더 잘 알고 있거나, 타입이 지정된 API와 작업해야 하는 경우, 원래 타입이 예상되는 것과 일치하지 않을 수 있습니다. 이를 위해 type casting 또는 타입 단언 메커니즘이 사용됩니다.

문제:

TypeScript에서 타입 변환(type casting)은 실행 시간에 값의 변환을 수행하지 않습니다. 단지 컴파일러에게 "나를 믿어라"라고 알리는 것입니다. 이는 지정된 캐스트가 실제 데이터 내용과 일치하지 않을 경우 오류로 이어질 수 있습니다. 오류는 런타임에만 발생하며 컴파일러가 발견하지 못합니다.

해결책:

TypeScript에는 두 가지 타입 변환 구문이 포함되어 있습니다: angle-bracket(구식, JSX에는 권장되지 않음)과 as 구문(추천됨).

코드 예:

// 꺽쇠 괄호를 통한 구문 ( .tsx에서는 사용하지 않음) let someValue: any = "Hello World"; let strLength: number = (<string>someValue).length; // as를 통해 구문 let strLength2: number = (someValue as string).length; // 객체 타입 변환 (안전하지 않음!) interface Cat { meow(): void; } interface Dog { bark(): void; } let dog: Dog = { bark() {} }; let cat = dog as unknown as Cat; // 가능하지만 타입 검증을 우회합니다!

주요 특징:

  • type casting(단언)은 런타임 전에 변수 내용을 변경하지 않고 단지 타입에 대한 제한을 제거합니다.
  • as 구문을 사용하는 것이 권장됩니다. — 모든 플랫폼에 대해 통일되고 JSX와 충돌하지 않습니다.
  • 잘못된 type casting은 타입 안전성의 "구멍"을 초래하고 런타임 오류를 발생시킵니다.

트릭 질문.

type assertion이 C#이나 Java처럼 런타임에 값의 자동 변환을 수행합니까?

아니요, type assertion은 그저 컴파일러에게 이 변수가 해당 타입이라고 알리는 것입니다. 어떤 값의 변환도 발생하지 않으며, 모든 책임은 개발자에게 있습니다.

구조가 공유되지 않는 타입 A를 타입 B로 변환할 수 있습니까?

TypeScript는 이를 허용합니다(예: double cast를 통해 any 또는 unknown 사용), 그러나 이는 타입 안전성을 저해하고 실행 단계에서 오류를 초래할 수 있습니다.

const a = 5 as unknown as string; // 안전하지 않습니다!

any를 복잡한 타입으로 변환하는 것이 안전합니까?

아니요, any는 타입 검사를 해제합니다. any를 다른 타입으로 변환할 수 있지만 TypeScript는 불일치를 감지할 수 없으며 모든 오류는 실행 시에만 나타납니다.

타입 오류 및 안티패턴

  • any/unknown을 통한 무분별한 변환, 전체 타입 시스템 우회
  • .tsx/JSX에서 angle brackets 사용 (구문 오류)
  • 구조 검증 없이 호환되지 않는 타입을 변환

실제 예

부정적 케이스

개발자가 구조 검증 없이 서버에서 객체를 받고, 이를 예상되는 타입으로 간단히 as SomeType으로 변환하여 비즈니스 로직에서 사용합니다. API 변경이나 서버의 버그로 인해 애플리케이션이 런타임에 중단되며, 컴파일 단계에서 오류가 발생하지 않습니다.

장점:

  • 빠르고 간단하며 타입의 "엄격함"을 회피합니다.

단점:

  • 타입 안전성 손실, 런타임 오류, 확신을 가지기 어려운 리팩토링.

긍정적 케이스

개발자가 수신된 객체의 구조를 사전 검증하고, 사용자 정의 type guard 함수를 사용한 후에만 type assertion을 수행합니다.

장점:

  • 타입 안전성이 유지되고, 값 사용 전에 오류가 감지됩니다.
  • 외부 API와 작업할 때의 안전성.

단점:

  • 검증을 위한 추가 코드가 필요하며, 초기 구현이 약간 더 복잡합니다.