
프로젝트를 하던 도중 이런 에러가 떴다.

이 부분에서 문제가 생긴거 같은데 isDeleted의 타입은 Boolean이였기 때문에 문제가 없어 보였다.
하지만 타입스크립트에서는 객체 Wrapper 타입을 지양한다. 객체 Wrapper 타입이란 대문자로 시작하는 타입인데 (Number, String, Boolean, Object 등) 반대는 원시타입이 있다.(number,string,boolean,object 등)
원시타입들은 객체 타입이 아니고 단순 데이터 타입이기 때문에 데이터를 저장한다. 즉 프로토타입이 없고 메서드도 없다.
하지만 자바스크립트에서는 이 원시 타입에 메소드를 사용하고는 하는데

이는 자바스크립트 엔진에서는 형 변환이 이루어지기 때문에 가능하다. 위 사례처럼 메서드를 사용하게 되면 순간적으로 string 타입이 객체 래퍼를 생성하여 해당 래퍼의 메서드를 사용하게 된다. 그리고 반환될 때에는 객체 타입이 아닌 string 원시 타입으로 반환되고 객체 타입은 가비지 컬렉팅 된다.

즉 이런 식으로 하게 되면 str의 값이 변하지 않는다는 것이다. 객체래퍼로 변환되고 0번째 인덱스의 값을 수정했지만 해당 객체가 사용되지 않고 가비지 컬렉팅 되기 때문에 원래 원시타입인 str 값에는 영향을 미치지 않기 때문이다.
타입스크립트는 자바스크립트의 동작을 모델링했다. 자바스크립트에서 선언되는 변수들은 모두 원시 타입으로 선언되게 되는데 만약 타입스크립트에서 변수를 객체 래퍼 타입으로 선언을 하게 되면 문제가 생길 수 있다.
만약 타입이 객체 래퍼 타입인 변수에 그냥 변수(즉 원시 타입)을 할당하려고 한다면?
그렇다면 바로 할당할 수 없다는 에러가 나게 된다.(ex String !== string) 따라서 타입스크립트에서는 변수를 선언할 때 객체 래퍼 타입을 사용해서는 안된다.
내 사례에서는 해당 Entity에서 isDeleted 의 타입이 Boolean으로 선언되어 있었다. 거기에 'false' 라는 boolean 원시타입 객체를 할당하려니까 에러가 났던 것이였다.

저기서 Boolean을

boolean 타입으로 변경하면 에러가 해결된다.
결론
타입스크립트에서 변수 타입 선언할 때에는 무조건 원시타입으로....
'프로그래밍 언어 > TypeScript' 카테고리의 다른 글
[TypeScript] Bcrypt를 이용한 비밀번호 해쉬화(암호화) (0) | 2023.12.15 |
---|---|
[TypeScript] 타입스크립트 알아보기 (2) 함수, 인터페이스, 제네릭 (0) | 2023.08.22 |
[TypeScript] 타입스크립트 알아보기 (1) 쓰는 이유와 타입의 종류 (0) | 2023.08.22 |
[TypeScript] 타입스크립트란? (0) | 2023.03.05 |