TypeScript는 원시 타입(string, number, boolean)과 그 객체 래퍼(String, Number, Boolean)를 구별합니다. 래퍼는 생성자를 통해 만들어진 객체입니다:
const primitive: string = 'hello'; const wrapper: String = new String('hello');
primitive === wrapper와 비교하면 결과는 false입니다:console.log('hello' === new String('hello')); // false
string, String이 아닌)을 사용하는 것이 좋습니다.원시 값이 있을 때 TypeScript 인터페이스에서 래퍼 타입(
String,Number,Boolean)을 사용할 수 있을까요?
답변: 래퍼를 사용하는 것은 권장되지 않습니다: 대부분의 경우 값은 원시 타입이므로 인터페이스가 래퍼 타입을 직접 상속하게 되면 오류가 발생할 수 있습니다. 항상 string, number, boolean을 사용하는 것이 좋습니다.
사례
웹 애플리케이션에서 사용자 이름 저장을 위해 인터페이스에 String 타입이 사용되었습니다. 이는 비교 오류와 동일한 타입(strong type)에 대한 요구로 인해 유닛 테스트 실패로 이어졌습니다.
사례
라이브러리 개발자가 제너릭 함수를 Number로 타입을 지정하였고, 라이브러리 클라이언트가 원시 값을 전달하여 타입 가드 메서드가 원시에 대해 예상치 못한 작동을 하지 않는 문제가 발생했습니다. 복잡한 타입 캐스팅 오류가 나타났습니다.
사례
분석 서비스에서 사용자 활성화 플래그로 Boolean 타입이 사용되었고, 데이터 필터링 시 비교 결과는 항상 false였으며, 시각적으로 값이 일치했음에도 불구하고 잘못된 데이터 처리 및 보고서 오류가 발생했습니다.