Table of contents
타입을 작성할 때 반복적으로 코드를 작성하고 싶지 않은 경우, 때때로 당신은 다른 타입을 기반하여 타입을 생성할 수도 있다.
맵트 타입은 아래와 같은 인덱스 시그니처를 위한 문법에 기초하여, 미리 선언되지 않은 프로퍼티 타입을 선언하는 데 사용한다. (아래는 맵트 타입의 예제가 아니고 인덱스 시그니처의 예제다)
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
역할을 하게 된다는 것이다.
이 예제에서, OptionsFlags
는 Type
타입의 모든 프로퍼티를 받고, 그 모든 값을 아래 예제와 같이 boolean
타입이 되도록 바꾼다.
-property-in-keyof-generic.ts-
...
type FeatureFlags = {
darkMode: () => void;
newUserProfile: () => void;
}
type FeatureOptions = OptionsFlags<FeatureFlags>;
// type FeatureOptions = {
// darkMode: boolean;
// newUserProfile: boolean;
// }
맵트 타입에는 맵핑 도중에 적용될 수 있는 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-