Table of contents

6.7.0. Inroduction

타입을 작성할 때 반복적으로 코드를 작성하고 싶지 않은 경우, 때때로 당신은 다른 타입을 기반하여 타입을 생성할 수도 있다.

맵트 타입은 아래와 같은 인덱스 시그니처를 위한 문법에 기초하여, 미리 선언되지 않은 프로퍼티 타입을 선언하는 데 사용한다. (아래는 맵트 타입의 예제가 아니고 인덱스 시그니처의 예제다)

type OnlyBoolsAndHorses = {
	[key: string]: boolean | Horse;
};

const conforms: OnlyBoolsAndHorses = {
	del: true,
	rodney: false
}

맵트 타입은 타입을 생성하기 위해 (일반적으로 keyof를 통해 생성하는)PropertyKey의 유니온 타입을 사용하여 키들을 반복 처리하는 제네릭 타입이다.

-property-in-keyof-generic.ts-

type OptionsFlags<Type> = {
	[Property in keyof Type]: boolean;
};

유의할 점은 여기서 사용한 Property는 정해진 이름이 아니며, in 앞의 요소는 PropertyKey 역할을 하게 된다는 것이다.

이 예제에서, OptionsFlagsType 타입의 모든 프로퍼티를 받고, 그 모든 값을 아래 예제와 같이 boolean 타입이 되도록 바꾼다.

-property-in-keyof-generic.ts-

...
type FeatureFlags = {
	darkMode: () => void;
	newUserProfile: () => void;
}

type FeatureOptions = OptionsFlags<FeatureFlags>;
// type FeatureOptions = {
//   darkMode: boolean;
//   newUserProfile: boolean;
// }

6.7.1. Mapping Modifiers

맵트 타입에는 맵핑 도중에 적용될 수 있는 2개의 추가 모디파이어가 존재한다. 하나는 readonly이고 다른 하나는 ? 기호다. 각각 불변성과 선택성에 영향을 준다.

다소 다른 점은 - 혹은 + 기호를 앞에 붙이면서 모디파이어를 적용할 수 있다는 것이다. -기호를 앞에 붙인 경우 참조한 타입에서 해당 모디파이어의 특성을 제거하고 + 기호를 앞에 붙인 경우 그 특성을 추가한다. 예를 들어 맵트 타입이 참조한 타입의 특정 프로퍼티가 readonly가 적용되어 있다해도, 맵트 타입의 정의에서 -readonly를 적용하면, 이 맵트 타입 개체의 해당 프로퍼티는 읽기전용이 아니게 된다. 아무 기호도 추가하지 않으면 +기호를 입력한 것으로 간주한다.

-mapping-modifiers-readonly.ts-

type CreateMutable<Type> = {
	-readonly [Property in keyof Type]: Type[Property];
}

type LockedAccount = {
	readonly id: string;
	readonly name: string;
};

type UnlockedAccount = CreateMutable<LockedAccount>;
// type UnlockedAccount = {
//   id: string; // readonly가 제거되었다.
//   name: string; // readonly가 제거되었다.
// }

-mapping-modifiers-optional.ts-