본문 바로가기
개인공부/Typescript 공부

Typescript 객체

by 강물둘기 2023. 2. 28.

* 조시 골드버그의 러닝 타입스크립트라는 책을 읽고 정리하면서 코드를 작성해본 내용입니다.

 

 

1. 객체 타입

객체 타입에 접근할 때 존재하지 않는 프로퍼티에 접근하려고 하면 타입 오류가 발생한다.(자바스크립트에서는 오류가 발생하지 않는다.)

 

객체 타입 선언

객체 리터럴 선언과 유사하게 객체의 타입을 선언할 수 있다.

 

별칭 객체 타입

위와 같이 선언하는것 보다는 타입 별칭을 할당하여 사용하는것이 일반적이다.

타입 별칭을 사용하면 이후에 같은 타입의 객체를 만들 때 재사용 가능하기 때문에 유용하다.

 

 

2. 구조적 타이핑

먼저 자바스크립트는 덕 타이핑 언어이다. 덕 타이핑(duck typing)이란 동적 타이핑의 한 종류로 객체의 변수 및 메서드의 집합이 객체의 타입을 결정하는 것을 말한다. 덕 타이핑은 컴파일단계에서는 타입을 확인하지 않고 런타임에 넘어가 사용될 때 타입을 결정한다.

 

반면 타입스크립트의 타입 시스템은 구조적으로 타입화 되어있는 구조적 타이핑 언어이다. 코드 작성 단계에서(컴파일 전단계) 코드 구조상에서 작성되는 변수의 타입이 적절한지 검사하여 적절하지 않으면 오류를 발생시킨다. 

 

사용 검사

타입스크립트는 객체 리터럴을 선언할 때 객체 타입 애너테이션과 타입 및 프로퍼티가 일치하는지 확인한다. 프로퍼티 값이 타입과 맞지 않으면 오류가 발생하고 필요한 프로퍼티가 없는 경우에도 오류가 발생한다.

 

초과 속성 검사

위에서 이어지는 이야기로 초깃값에 객체 타입에서 정의된 것보다 많은 프로퍼티가 있으면 오류가 발생한다.

 

중첩된 객체 타입

중첩된 객체에도 타입 별칭이 사용 가능하다.

중첩된 객체를 오른쪽 코드와 같이 고유한 타입 이름으로 바꿔서 사용하면 코드와 오류 메시지가 더 읽기 쉬워진다.

 

선택적 속성

모든 객체에 객체 타입 속성이 필요한 것은 아니기 때문에 선택적으로 속성이 필요한 경우에는 타입의 속성 애너테이션 : 앞에 ? 를 추가하면된다.

age 속성은 선택적 속성이라서 객체를 선언할때 없어도 오류가 나지 않지만, name 속성은 필수속성이기 때문에 선언할 때 없으면 오류가 발생한다.

 

* 선택적 속성과 undefined를 포함한 유니언 타입의 속성은 다르다.

undefined를 포함한 유니언 타입의 속성은 필수속성이기 때문에 값이 undefined라도 속성자체는 있어야 한다. 

 

 

3. 객체 타입 유니언

각각의 프로퍼티들이 여러가지 타입이 될 수 있는 타입을 설정할 수 있다. 타입 내로잉 또한 가능하다.

 

유추된 객체 타입 유니언

타입을 명시적으로 선언하지 않고 객체를 담은 변수에 초기값을 주면 타입스크립트가 자체적으로 타입을 유추한다.

 

명시된 객체 타입 유니언

의도치 않은 타입의 값을 할당하는 것을 방지하기 위해 객체에 명확하게 타입을 정의할 수도 있다.

위에서 타입스크립트가 유추한 타입과 약간 다르게 작성한 것을 확인할 수 있다. 이렇게 명시적으로 객체의 타입을 지정하면 개발자의 의도를 명확히 하여 코드를 안전하게 지킬 수 있다.

 

객체 타입 내로잉

조건문을 통하여 특정 프로퍼티가 있는 경우에 코드를 실행하도록 타입 내로잉(type narrowing)을 할 수 있다.

위의 코드에서 그냥 person의 age 속성에 접근하려고 하면 오류가 발생하지만(age속성이 없을수도 있다.), 조건문을 사용하여 타입을 좁힌 후에는 접근이 가능하다. age속성이 없으면 무조건 country속성이 있다는 것도 타입스크립트가 유추할 수 있다.

 

자바스크립트에서처럼 조건으로 undefined가 나올것을 예상하여 위와 같은 코드를 작성하는 것은 타입스크립트에서는 불가능하다.

 

판별된 유니언

객체의 속성중 하나가 객체의 형태를 나타내도록 지정해 주는 타입 형태를 판별된 유니언 이라고 한다.

위 코드처럼 타입에 특정 값을 지정해주면 나중에 person 변수를 사용할 때 type값이 어떤 것인지에 따라 다르게 처리를 해주면 된다.

 

 

4. 교차 타입

교차 타입 & 연산자를 사용하여 여러 타입을 동시에 나타낼 수 있다. 교차 타입은 일반적으로 여러 기존 객체 타입을 별칭 객체 타입으로 결합해 새로운 타입을 생성한다.

 

교차 타입은 유니언 타입과 결합 가능하다. 

 

교차 타입의 위험성

교차 타입은 가능한 한 코드를 간결하게 유지해야 한다.

 

긴 할당 가능성 오류

복잡한 교차 타입을 만들게 되면 할당 가능성 오류 메시지를 읽기 어려워진다.

 

never

교차 타입은 잘못 사용하기 쉽고 불가능한 타입을 생성한다. 원시 타입의 값은 동시에 여러가지 타입이 될 수 없기 때문에 원시타입은 교차 타입으로 결합할 수 없다. 이런 경우 타입은 never가 된다.

이 타입에는 string과 number 타입의 값을 할당할 수 없고, 다른 모든 타입의 값도 할당할 수 없다.

 

 

Reference

- 조시 골드버그, 러닝 타입스크립트, 고승원 옮김, 2023

- https://vallista.kr/%EB%8D%95-%ED%83%80%EC%9D%B4%ED%95%91%EA%B3%BC-%EA%B5%AC%EC%A1%B0%EC%A0%81-%ED%83%80%EC%9D%B4%ED%95%91/

'개인공부 > Typescript 공부' 카테고리의 다른 글

Typescript 인터페이스  (0) 2023.03.05
Typescript 배열  (0) 2023.03.03
Typescript 함수  (0) 2023.03.01
유니언과 리터럴  (0) 2023.02.26
Typescript의 타입 - 러닝 타입스크립트  (0) 2023.02.25

댓글