4. 객체
📚

4. 객체

Description
객체에 관한 내용
Published
2023-09-04

정리

객체 타입

{...} 구문을 사용해서 객체 리터럴을 생성하면, 타입스크립트는 해당 속성을 기반으로 새로운 객체 타입 또는 타입 형태를 고려한다. 해당 객체 타입은 객체의 값과 동일한 속성명과 원시 타입을 갖는다.
존재하지 않는 속성 이름으로 접근하려고 하면 해당 이름이 존재하지 않는다는 타입 오류가 발생한다.
 

객체 타입 선언

객체 타입은 객체 리터럴과 유사하게 보이지만 필드 값 대신 타입을 사용해 설명한다.
 

별칭 객체 타입

객체 타입에 타입 별칭을 할당해 사용하는 방법이 일반적이다.
 

구조적 타이핑

타입스크립트의 타입 시스템은 구조적으로 타입화(structurally typed)되어 있다. 이 말은 매개변수나 변수가 특정 객체 타입으로 선언되면 타입스크립트에 어떤 객체를 사용하든 해당 속성이 있어야 한다는 의미이다.
구조적 타이핑은 덕 타이핑(duck typing)과는 다르다. 구조적 타이핑은 정적 시스템이 타입을 검사하는 경우이며, 덕 타이핑은 런타임에서 사용될 때까지 객체 타입을 검사하지 않는 것을 말한다.
 

사용 검사

객체 타입으로 애너테이션된 위치에 값을 제공할 때 타입스크립트는 값을 해당 객체 타입에 할당할 수 있는지 확인한다.
할당하는 값에는 객체 타입의 필수 속성이 있어야 하고 없으면 타입스크립트는 타입 오류를 발생시킨다.
필수 속성 이름은 일치하고 타입이 일치하지 않으면 타입 오류를 발생시킨다.
 

초과 속성 검사

변수가 객체 타입으로 선언되고, 초깃값에 객체 타입에서 정의된 것보다 많은 필드가 있다면 타입스크립트에서 타입 오류가 발생한다.
초과 속성 검사는 객체 타입으로 선언된 위치에서 생성되는 객체 리터럴에 대해서만 일어난다. 기존 객체 리터럴을 제공하면 초과 속성 검사를 우회한다.
타입스크립트에서 초과 속성을 금지하면 코드를 깨끗하게 유지할 수 있고, 예상한 대로 작동하도록 만들 수 있다.
 

선택적 속성

타입의 속성 애너테이션에서 : 앞에 ?를 추가하면 선택적 속성임을 나타낼 수 있다.
선택적 속성과 undefined를 포함한 유니언 타입의 속성 사이에는 차이가 있다. ?를 사용해 선택적으로 선언된 속성은 존재하지 않아도 되지만 필수로 선언된 속성과 | undefined는 그 값이 undefined일지라도 반드시 존재해야 한다.
 

객체 타입 유니언

타입스크립트 코드에서 속성이 조금 다른, 하나 이상의 서로 다른 객체 타입이 될 수 있는 타입을 설명할 수 있어야 한다.
속성값을 기반으로 해당 객체 타입 간에 타입을 좁혀야 할 수도 있다.
 

유추된 객체 타입 유니언

변수에 여러 객체 타입 중 하나가 될 수 있는 초깃값이 주어지면 타입스크립트는 해당 타입을 객체 타입 유니언으로 유추한다.
유니언 타입은 가능한 각 객체 타입을 구성하고 있는 요소를 모두 가질 수 있다.
객체 타입에 정의된 각각의 가능한 속성은 비록 초깃값이 없는 선택적(?) 타입이지만 각 객체 타입의 구성 요소로 주어진다.
 

명시된 객체 타입 유니언

객체 타입의 조합을 명시하면 객체 타입을 더 명확히 정의할 수 있다.
값의 타입이 객체 타입으로 구성된 유니언이라면 타입스크립트의 타입 시스템은 이런 모든 유니언 타입에 존재하는 속성에 대한 접근만 허용한다.
 

객체 타입 내로잉

코드에서 객체의 형태를 확인하고 타입 내로잉이 객체에 적용된다.
존재하지 않는 객체의 속성에 접근하려고 시도하면 타입 가드처럼 작동하는 방식으로 사용되더라도 타입 오류로 간주된다.
 

판별된 유니언

객체의 속성이 객체의 형태를 나타내도록 하는 타입 형태를 판별된 유니언(discriminated union)이라 부르고, 객체의 타입을 가리키는 속성이 판별값이다.
타입스크립트는 코드에서 판별 속성을 사용해 타입 내로잉을 수행한다.
 

교차 타입

타입스크립트에서 & 교차 타입(intersection type)을 사용해 여러 타입을 동시에 나타낸다.
교차 타입은 일반적으로 여러 기존 객체 타입을 별칭 객체 타입으로 결합해 새로운 타입을 생성한다.
교차 타입을 사용할 때는 되도록 코드를 간결하게 유지해야 한다.
교차 타입은 잘못 사용하기 쉽고 불가능한 타입(never)을 생성한다.
원시 타입의 값은 동시에 여러 타입이 될 수 없기 때문에 교차 타입의 구성 요소로 함께 결합할 수 없다.
 

생각

구조적 타이핑과 덕 타이핑이 명확하게 와닿지 않는다… 판별된 유니언을 활용해 볼 기회가 생각보다 잘 없다.