728x90
객체의 타입을 설정할 때 있었던 일이다.
const winner = {
"One": false,
"Two": false,
"Three": true,
};
이런 객체가 있다고 가정해보자.
객체의 Key값은 One, Two, Three만 될 수 있기에, 타입으로 제한해보자 👻
가장 처음 떠올릴 수 있는 방법은 다음과 같다!
type KeyExample = "One" | "Two" | "Three";
const winnerFail: { [key: KeyExample]: boolean } = {
"One": false,
"Two": false,
"Three": true,
}
이렇게 하면 될 것 같지만!
에러가 발생한다.
타입 에러에 따르면, 인덱스 시그니쳐 파라미터 타입은 literal 타입이나 generic 타입이 될 수 없다....
때문에 위와 같이 타입핑을 하려면 다음과 같이 해야한다.
const winnerFail: { [key: string]: boolean } = {
"One": false,
"Two": false,
"Three": true,
}
하지만, 이 경우 원래 의도처럼 Key의 타입핑을 하는 건 아니게 된다 😭
그렇다면, 어떻게 이 경우 타입핑을 잘 할 수 있을까???
바로, Record를 사용하면 된다 ! 🎶
type KeyExample = "One" | "Two" | "Three";
const winnerSuccess: Record<KeyExample, boolean> = {
"One": false,
"Two": false,
"Three": true,
}
Record를 사용하여 다음과 같이 작성하면,
원하던대로 객체 key값을 제한할 수 있다 👍👍👍
+ 24.11.14) 나중에 생각해보니, in 키워드를 사용하면 최초의 작성한 코드와 유사하지만, 동작하는 코드를 만들 수 있다.
Record 유틸리티 타입을 사용해야 겠다!는 생각탓에 in에 대해서 생각하지 못한 듯 하다...
in을 사용하면, Union을 순회하여 모든 경우에 대한 객체 프로퍼티 타입 설정이 가능하다.
type KeyExample = "One" | "Two" | "Three";
const winnerFail: { [key in KeyExample]: boolean } = {
"One": false,
"Two": false,
"Three": true,
}
Record와 in 키워드를 사용하는 두 방법은 취향차이가 아닐까?
개인적으로는 in 키워드가 더 직관적인 것 같아 좋다.
728x90
'TypeScript' 카테고리의 다른 글
타입스크립트에서 기존 코드로부터 타입을 가져오는 법 ReturnType, ComponentProps (0) | 2024.09.18 |
---|---|
타입가드 사용하여 안전하게 타입스크립트 타이핑하기 (0) | 2024.08.04 |
TypeScript에서 enum 사용하기: const enum vs as const 객체 (0) | 2024.04.01 |
TypeScript에서 객체 타입 체크하는 방법: in 키워드 활용하기 (0) | 2024.03.16 |
unknown과 any 차이점 알아보기 (0) | 2023.08.19 |