객체 타입
객체 리터럴은 중괄호({…}) 사용하여 생성할 수 있는데, 타입스크립트는 객체의 각각의 키에 대한 값에 따라 타입을 결정하게 됩니다.
객체 타입 선언
객체 타입은 객체 리터럴과 유사하게 보이지만 값 대신 타입을 사용하여 설명합니다.
별칭 객체 타입
{name: string, age: number} 와 같은 객체 타입을 계속 작성하는 것은 효율적이지 못하고 귀찮습니다. 일반적으로는 각 객체 타입에 타입 별칭을 할당하여 사용합니다. (대부분의 타입스크립트 프로젝트에서는 객체 타입을 설명할 때 인터페이스(interface) 키워드를 사용하는 것을 선호)
구조적 타이핑
타입스크립트의 타입 시스템은 구조적으로 타입화(structurally typed)되어 있습니다. 즉, 타입을 충족하는 모든 값을 해당 타입의 값으로 사용할 수 있습니다.(타입 오류가 발생하지 않음)
사용 검사
객체 타입으로 에노테이션 된 위치에 값을 제공할 때 타입스크립트는 값을 해당 객체 타입에 할당 할 수 있는지 확인합니다. 할당하는 값에 객체 타입의 필수 속성을 가지고 있어야지, 만약 없다면 타입 오류를 발생합니다.
또한 둘 사이에 일치하지 않은 타입이 있어도 타입 오류를 발생합니다.
객체 타입은 필수 속성 이름 과 해당 속성 이 예상되는 타입을 모두 지정하기 때문에 객체의 속성이 일치하지 않으면 타입스크립트는 타입 오류를 발생합니다.
초과 속성 검사
변수가 객체 타입으로 선언되고, 초기값에 객체 타입에서 정의된 것보다 많은 필드가 있다면 타입스크립트는 타입 오류를 발생합니다. 변수를 객체 타입으로 선언하는 것은 타입 검사기가 해당 타입에 예상되는 필드만 있는지 확인하는 방법이기도 합니다.
초과 속성 검사는 객체 타입으로 선언된 위치에서 생성되는 객체 리터럴에 대해서만 일어납니다. 기존 객체 리터럴을 제공하면 초과 속성 검사를 우회하기 때문에 타입 오류가 발생하지 않습니다.
객체 타입에 선언되지 않은 초과 속성은 예상하지 않은 데이터 값을 갖게 되어 예상하는 대로 작동하지 않을 수도 있습니다. (초과 속성을 비활성화하면 코드를 깨끗하게 유지할 수 있고, 예상한 대로 작동하도록 만들 수 있습니다.)
중첩된 객체 타입
타입스크립트의 객체 타입도 자바스크립트 객체와 같이 타입 시스템에서 중첩된 객체 타입을 나타낼 수 있습니다. 그리고 중첩된 타입을 자체 타입 별칭으로 추출하는 방법도 있습니다.
이처럼 중첩된 객체 타입을 고유한 이름으로 바꿔서 사용하면 코드와 오류 메시지가 더 읽기 쉬워집니다.
선택적 속성
타입의 속성 에노테이션에서 : 앞에 ? 를 추가하면 선택적 속성임을 나타낼 수 있습니다. 선택적 속성은 모든 객체에 객체 타입 속성 중 생략하고 싶은 속성이나 존재하지 않아도 되는 속성에 대해 사용합니다.
선택적 속성과 undefined를 포함한 유니언 타입은 서로 다릅니다. ? 를 사용해 선택적으로 선언된 속성은 존재하지 않아도 됩니다. 하지만 필수로 선언된 속성과 | undefined 는 그 값이 undefined일지라도 반드시 존재해야 합니다.
객체 타입 유니언
객체 타입의 조합을 명시하면 객체 타입을 더 명확하게 정의 할 수 있습니다.
위 코드를 보면 age와 gender는 항상 존재한다는 보장을 할 수 없는 속성입니다. 이때 타입스크립트는 해당 속성의 타입을 선택적 타입으로 유추하게 됩니다.
const person = Math.random() > 0.5
? {name: 'Kim', age: 31}
: {name: 'Kim', gender: 'male'};
/*
타입 :
{name: string; age: number; gender?: undefined;}
| {name: string; gender: string; age?: undefined;}
*/
person.name // 타입: string
person.age // 타입: number | undefined
person.gender // 타입: string | undefined
값이 여러 타입 중 하나일 경우, 모든 타입에 존재하지 않는 속성이 객체에 존재할 거라고 보장할 수 없습니다. 잠재적으로 존재하지 않은 객체의 속성에 대한 접근을 제한하면 코드의 안전을 지킬 수 있습니다.
타입 검사기가 유니언 타입 값에 특정 속성이 포함된 경우에만 코드 영역을 실행할 수 있음을 알게 되면, 값의 타입을 해당 속성을 포함하는 구성 요소로만 좁힙니다. (내로잉)
타입스크립는 존재하지 않는 객체의 속성에 접근하려고 시도하면 타입 오류로 간주하게 됩니다. 그렇기 때문에 if(person.age) 와 같은 형식으로 참 여부를 확인 하는 것을 허용하지 않습니다.
타입스크립트에서 객체의 속성이 객체의 형태를 나타내도록 하는 형태를 판별된 유니언이라고 부르고, 객체의 타입을 가리키는 속성을 판별값이라고 합니다.(타입스크립트는 코드에서 판별 속성을 사용해 타입 내로잉을 수행)
교차 타입
타입스크립트에서 & 교차타입(intersection type)을 사용해 여러 타입을 동시에 나타낼 수 있습니다. 교차 타입은 일반적으로 여러 개의 기존 객체 타입을 별칭 객체 타입으로 결합해 새로운 타입을 생성합니다.
교차 타입은 유용한 개념이지만, 사용자나 타입스크립트 컴파일러를 혼동시키기 쉽습니다. 그렇기 때문에 교차 타입을 사용할 때는 가능한 코드를 간결하게 유지해야 합니다.
never
원시 타입의 값은 동시에 여러 타입이 될 수 없기 때문에 교차 타입의 구성 요소로 함께 결합할 수 없습니다. 만약 두개의 원시 타입을 교차 타입으로 결합하는 경우 never 키워드로 표시되어 never 타입이 됩니다.
이러한 never 키워드와 never 타입은 그 어떠한 타입도 제공할 수 없습니다.
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=307683870
러닝 타입스크립트
자바스크립트 세계를 정복한 타입스크립트는 강력한 타입 안정성에 힘입어 가장 빠르게 성장하고 있다. 언어의 역사를 살펴보며 진화 과정과 작동 방식을 이해하고, 개념 설명을 돕는 수많은
www.aladin.co.kr
'Books > Learning TypeScript' 카테고리의 다른 글
6. 인터페이스 (0) | 2023.03.04 |
---|---|
5. 배열 (0) | 2023.02.23 |
4. 함수 (0) | 2023.02.21 |
2. 유니언과 리터럴 (0) | 2023.02.16 |
1. 타입 시스템 (0) | 2023.02.15 |