✏️Before

interface User {
  name: string;
  age: number;
  gender?: string;
  readonly birthYear: number;
  1?: string;
  2?: string;
  3?: string;
  4?: string;
}

let user2:User = {
  name: 'aaa',
  age: 30,
  birthYear: 1990,
  1: 'A'
}

1부터 4까지 key는 number이고, value는 string인 interface가 중복된다.

interface의 내부도 type으로 지정할 수 있다.

⭐️After 1-1

interface User {
  name: string;
  age: number;
  gender?: string;
  readonly birthYear: number;
  [grade:number]: string;
}

let user2:User = {
  name: 'aaa',
  age: 30,
  birthYear: 1990,
  1: 'A'
}

grade라는 key 값은 number이고, value는 string이다.

여기서 string의 값을 조금 더 한정적으로 좁혀줄 수 있다.

⭐️After 1-2

type Score = 'A' | 'B' | 'C' | 'D' | 'F'

interface User {
  name: string;
  age: number;
  gender?: string;
  readonly birthYear: number;
  [grade:number]: Score;
}

let user2:User = {
  name: 'aaa',
  age: 30,
  birthYear: 1990,
  1: 'A'
}

❌

type Score = 'A' | 'B' | 'C' | 'D' | 'F'
interface User {
  name: string;
  age: number;
  gender?: string;
  readonly birthYear: number;
  [grade:number]: Score;
}

let user2:User = {
  name: 'aaa',
  age: 30,
  birthYear: 1990,
  <u>1: 'b'</u>
}

type에 정의되어 있지 않은 value 값을 쓰는 경우,

Type  "b"  is not assignable to type  Score . Did you mean  "B" ?

이런 error가 뜬다.