0Pricing
TypeScript Academy · 강의

알려진 키와 동적 키 결합

고정 속성과 인덱스 시그니처를 안전하게 조합합니다.

알려진 키와 동적 키 결합은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

고정 속성과 Flexible

객체에 몇 가지 보장된 속성과 제한 없이 추가할 수 있는 항목이 함께 있는 경우가 많습니다. TypeScript에서는 하나의 타입에 이름이 지정된 속성과 인덱스 시그니처를 함께 선언할 수 있지만, 중요한 제약 조건이 하나 있습니다.

시그니처와 함께 사용하는 알려진 key

여기서 length는 항상 존재하고, 그 밖의 모든 문자열 key는 숫자 값에 대응합니다. 이름이 지정된 속성과 인덱스 시그니처가 함께 존재하는 것입니다.

interface NumberMap {
  length: number
  [key: string]: number
}
const m: NumberMap = { length: 2, a: 1, b: 1 }
console.log(m.length, m.a)

호환성 제약 조건

주의할 점은 모든 고정 속성의 타입을 인덱스 시그니처의 값 타입에 할당할 수 있어야 한다는 것입니다. 인덱스 시그니처는 모든 key에 대한 약속이므로 이름이 지정된 각 key도 이 약속을 따라야 합니다.

interface Valid {
  id: number       // ok: number matches the signature
  [key: string]: number
}
const v: Valid = { id: 1, score: 99 }
console.log(v.id + v.score)

제약 조건을 위반하면

고정 속성의 타입이 인덱스 값 타입과 일치하지 않으면 TypeScript는 해당 선언을 거부합니다. 문자열 key를 가진 속성은 숫자 값을 사용하는 사전에 들어갈 수 없습니다.

// interface Broken {
//   name: string   // Error: string not assignable to number
//   [key: string]: number
// }

인덱스 값 타입 넓히기

서로 다른 고정 속성 타입을 허용하려면 모든 타입을 포함하는 유니언으로 인덱스 시그니처를 넓히십시오. 이제 문자열 이름과 숫자 점수를 모두 담을 수 있습니다.

interface Record {
  name: string
  [key: string]: string | number
}
const r: Record = { name: "ana", score: 10 }
console.log(r.name, r.score)

선택적 고정 속성

고정 속성은 ?를 사용해 선택 사항으로 만들 수 있습니다. 속성이 존재할 때는 여전히 인덱스 시그니처와 호환되어야 합니다.

interface Config {
  id: string
  label?: string
  [key: string]: string | undefined
}
const c: Config = { id: "x" }
console.log(c.label) // undefined

선택적 속성에 undefined가 필요한 이유

선택적 속성은 누락될 수 있으므로 유효한 타입에 undefined가 포함됩니다. 따라서 인덱스 시그니처도 undefined를 허용해야 하며, 그렇지 않으면 TypeScript가 선택적 멤버에 대해 오류를 보고합니다.

interface Safe {
  title?: string
  [key: string]: string | undefined
}
const s: Safe = {}
for (const k in s) console.log(s[k])

유니언을 통한 서로 다른 값 타입

현실적인 설정 객체에는 알려진 불리언 플래그, 알려진 문자열, 임의의 추가 값이 함께 있을 수 있습니다. 시그니처의 유니언은 모든 고정 속성 타입을 포함합니다.

interface Settings {
  enabled: boolean
  theme: string
  [key: string]: boolean | string
}
const s: Settings = { enabled: true, theme: "dark", lang: "en" }
console.log(s.enabled, s.lang)

알려진 keys가 있는 숫자 인덱스

이 제약 조건은 숫자 인덱스 시그니처에도 적용됩니다. 이름이 지정된 숫자 속성은 숫자 인덱스의 값 타입과 일치해야 합니다.

interface Sparse {
  count: number
  [index: number]: number
}
const sp: Sparse = { count: 1, 0: 100, 1: 200 }
console.log(sp.count, sp[0])

더 깔끔한 대안

고정 keys와 동적 keys의 타입이 실제로 서로 관련이 없다면 둘을 분리하는 방법을 고려하십시오. 동적인 부분을 별도의 속성 아래에 중첩하면 어색한 유니언을 만들지 않아도 됩니다.

interface Better {
  name: string
  scores: { [key: string]: number }
}
const b: Better = { name: "ana", scores: { math: 90 } }
console.log(b.name, b.scores.math)

언제 결합할까요

고정 속성이 추가 항목의 값 타입을 자연스럽게 공유할 때 알려진 keys와 동적 keys를 결합하십시오. 예를 들면 total이 있는 카운터나, 같은 종류의 설정과 몇 가지 보장된 플래그가 있습니다. 그렇지 않다면 중첩하는 편이 타입의 일관성을 유지합니다.

interface Tally {
  total: number
  [bucket: string]: number
}
const t: Tally = { total: 0, a: 3, b: 5 }
t.total = t.a + t.b
console.log(t.total) // 8

빠른 확인

고정 keys와 동적 keys를 함께 사용하는 방법에 대한 이해도를 테스트해 보십시오.

복습

고정 속성과 인덱스 시그니처를 함께 선언할 수 있지만, 각 고정 속성의 타입을 인덱스 시그니처의 값 타입에 할당할 수 있어야 합니다. 서로 다른 고정 속성 타입을 수용하려면 유니언으로 시그니처를 넓히고, 고정 속성이 선택 사항이면 undefined를 포함하십시오. 타입이 실제로 서로 관련이 없다면 동적인 부분을 별도의 key 아래에 중첩하는 편이 좋습니다.

자주 묻는 질문

“알려진 키와 동적 키 결합” 강의는 무료인가요?

네 — “알려진 키와 동적 키 결합” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“알려진 키와 동적 키 결합”에서 뭘 배우나요?

고정 속성과 인덱스 시그니처를 안전하게 조합합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“알려진 키와 동적 키 결합” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 인덱스 시그니처 정의
  2. 문자열과 숫자 인덱스 시그니처 비교
  3. 알려진 키와 동적 키 결합
  4. 인덱스 시그니처와 Record 비교
← TypeScript Academy(으)로 돌아가기