인프런 커뮤니티 질문&답변
이게 된다는걸 어떻게 판단할 수 있나요?
해결된 질문
작성
·
34
0
const db: {
[postId: PostId]: Post;
[userId: UserId]: User;
} = {};
이 강의를 보지 않고 이게 된다는걸 판단할려면 어떻게 판단할 수 있나요?
모호한 질문 죄송합니다. 구체적으로 질문하고 싶은데 내공이 부족한 것 같습니다.
답변 2
1
안녕하세요 답변이 늦었습니다.
제가 질문 의도를 이해를 못했는데 그냥 질문 그대로 답변을 드리자면
https://www.typescriptlang.org/play/?#code/MYewdgzgLgBAJgIwFwwN4wNoAcTQJJwoAKuUBAusaQNyYCuEApgE4EoCqTrclMnLtAL4wAvGkHUgA
이런 타입스크립트 플레이그라운드에서 타입이 맞냐 아니냐를 확인가능합니다. 그리고 굳이 타입에러를 없애겠다고 하면
type PostId = `post_${string}`;
type UserId = `user_${string}`;
type Post = {
title: string;
content: string;
};
type User = {
name: string;
email: string;
};
const db: { [postId: PostId]: Post; [userId: UserId]: User } = {};
// 사용 예시
db["post_1"] = { title: "Hello", content: "World" };
db["user_1"] = { name: "Kim", email: "kim@example.com" };이렇게 하면 되지 않을까 싶습니다.
안녕하세요 답변이 늦어서 죄송합니다.
결국
PostId는 string의 서브타입입니다. 제 생각의 흐름은 "아 PostId도 결국 string의 서브타입 (엄청 구체적인 타입, string이면서 _brand 속성도 가진 타입)이구나! 인덱스 시그니처 타입은 string | symbol | number... 가능하니까 string, symbol 등등 서브타입은 모두 가능하겠네?" 입니다. 원하시는 답변이 되셨을까요?
type PostId = string & { __brand: "PostId" };음 이건 저도 찾아보니까 타입스크립트 4.4부터 가능했더라고요. 아래 링크는 예시입니다. https://www.typescriptlang.org/play/?#code/AQ4FwTwBwU2AFA9gZzMAvMA3gKFOASzABsYAuYVAJwIDsBzAbj1AGNFawZOLq6mWAX2YtIsYAFVkMKhmwsQtAIYBbcpTA0GzfDBVKCxXpv47gwlgHpLwQC7jgGJrggDBbALl0A6Ny3a1UwJRSxgAG0AaxgICgADKBQwAH0AEiw+BkFIgF0KJF9BOSwLKxtbQGCawBHm4EACFuBADCHgQAjxwAHJ4EApUcARccAZOoB+YEAfdsADmuBAFNnAAw6vDl8AIwCFYLCI4GjYxOSTVIys2LMQUPCogFdpKmWU+jTMyUPGEGtgQAplwBZF22BATprADTmm5sAeccAJpvahPOEQA
참조: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-4.html
"final note on index signatures is that they now permit union types" 이 문장으로 찾아보세요!
0
안녕하세요, 인프런 AI 인턴입니다. 정중한 몽구스님.
주어진 코드에서 const db는 객체의 형태로 보이며, TypeScript에서 객체의 키를 동적으로 지정할 수 있는 방법들을 활용하고 있는 것으로 보입니다. 이때 [postId: PostId] 와 [userId: UserId]는 TypeScript의 인덱스 시그니처를 나타냅니다.
TypeScript에서는 객체의 키 타입을 특정하여 인터페이스를 정의할 수 있습니다. 예를 들어, 객체의 키를 PostId 타입과 UserId 타입으로 각각 지정하고, 그에 대한 값 타입을 Post와 User로 정의한 것입니다. 하지만, TypeScript에서 인덱스 시그니처는 동일한 타입으로만 선언될 수 있습니다. 다양한 타입을 키로 사용하고 여러 타입을 값으로 사용하려면 두 번 이상 선언이 필요합니다.
이런 점에서 const db 선언은 오류가 발생할 가능성이 있습니다. 실제로 사용할 때 각각의 ID 타입을 다른 방식으로 처리하거나 접근 방법을 다시 설정해야 할 수도 있습니다.
비슷한 주제나 문제에 대한 강의나 FAQ가 있다면 아래와 같이 이전의 질문들을 참조해보실 수 있습니다:
- TypeScript 인덱스 시그니처와 타입 선언 - 인덱스 시그니처에 대한 자세한 설명이 제공됩니다.
이러한 방식으로 해당 코드가 가능할지 결정하기 위해서는 TypeScript의 문법 규칙을 잘 알고 있어야 합니다. TypeScript 문서를 참조하시거나 관련 강의를 통해 조금 더 구체적인 타입 시스템의 동작을 이해하실 것을 권장 드립니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






우선 답변 감사합니다.
강의 내용이 너무 좋고 배워가는게 많지만, 강의를 보지 않더라도 이런게 있고 사용가능하다는걸 판단할 수 있도록 연습을 해야된다고 생각해서 질문을 드리게 되었습니다.
인덱스 시그니처의 키 타입에 브랜드 타입이 사용가능하다는 판단을 어떻게 할 수 있는지 궁금합니다.
인덱스 시그니처의 키 타입에 들어갈 수 있는 타입들이 string, number, symbol, 템플릿 리터럴, 해당 타입들의 조합인걸로 알고있는데 브랜드 타입을 사용하는게 생소한 것 같습니다.
type Brand<K, T> = T & { __brand: K }; 처럼 &를 사용하기 때문에요.
객체 리터럴 내부에 인덱스 시그니처를 동시에 두개 사용하는 판단을 어떻게 할 수 있는지 궁금합니다.
원래는 하나만 사용가능한걸로 알고있는데, 두개를 쓸수있다는 발상을 어떻게 할 수 있는지 궁금합니다.
알게 된 사용 방식은 실제 예시 코드를 작성해서 되는지 안되는지 확인하면 된다는걸로 이해했습니다.