TS 쓰면서 의구심 + 궁금증 해소 목적으로 작성해놓음

tConst가 컴파일 했을 때 단순 객체이기 때문에 더 가벼움enum을 사용하면 양방향 맵핑이 가능하다는 장점이 있음// 양방향 맵핑 e.g.
enum Role {
  Admin,     // 0
  User,      // 1
  Guest,     // 2
}
console.log(Role.Admin); // 0
console.log(Role[0]);    // "Admin"
개발 중 api 응답으로 데이터를 받다보면 이런식의 데이터가 꽤 있음
data = {
  upbit : [
    {
      "currency_pair": "KRW-BTC",
      "korean_name": "비트코인",
      "english_name": "Bitcoin",
    },
    {
      "currency_pair": "KRW-ETH",
      "korean_name": "이더리움",
      "english_name": "Ethereum",
    }
  ],
  bithumb : [
    {
      "currency_pair": "KRW-BTC",
      "korean_name": "비트코인",
      "english_name": "Bitcoin",
    },
    {
      "currency_pair": "KRW-ETH",
      "korean_name": "이더리움",
      "english_name": "Ethereum",
    }
  ]
}
구조를 보면
1. data는 객체
2. upbit,bithumb이라는 키값 존재
3. 각 upbit, bithumb이라는 키값에 객체로 된 배열이 존재 
이 데이터의 타입을 한번 정의해보자
interface Data {
  [exchange: string] : 
    {
      currency_pair : string,
      korean_name : string,
      english_name : string 
    }[]
}
이렇게 하나의 타입으로도 가능하지만 아까 1,2,3으로 나눴던 단계를 가지고 세분화 해서 타입을 정의해보면?
// 3. 각 `upbit`, `bithumb`이라는 키값에 객체로 된 배열이 존재 
interface DataDetail {
	currency_pair : string,
    korean_name : string,
    english_name : string 
} 
// 2. `upbit`,`bithumb`이라는 키값 존재 
// 1. `data`는 객체 
interface Data {
	[exchange: string] : DataDetail[]
}
만약 exchange도 타입을 정의하고 싶다면? (전체 코드로 작성하겠음) 
type Exchange = "upbit" | "bithumb"
interface DataDetail {
	currency_pair : string,
    korean_name : string,
    english_name : string 
} 
interface Data {
	[exchange: Exchange] : DataDetail[]
}
const data : Data = {
  upbit : [
    {
      "currency_pair": "KRW-BTC",
      "korean_name": "비트코인",
      "english_name": "Bitcoin",
    },
    {
      "currency_pair": "KRW-ETH",
      "korean_name": "이더리움",
      "english_name": "Ethereum",
    }
  ],
  bithumb : [
    {
      "currency_pair": "KRW-BTC",
      "korean_name": "비트코인",
      "english_name": "Bitcoin",
    },
    {
      "currency_pair": "KRW-ETH",
      "korean_name": "이더리움",
      "english_name": "Ethereum",
    }
  ]
}
요렇게 차근차근 타입을 정의하면 됨!
const countryCurrency = {
	KOREA : "KRW",
  	USA : "USD",
  	CANADA : "CAD",
} as const;
위 객체로부터 얻어낼 수 있는 타입은 3가지 존재
keyof, typeof를 통해 이끌어 낼 수 있음countryCurrency객체의 전체 타입 countryCurrency객체의 Key에 해당하는 Union 타입 countryCurrency객체의 Value에 해당하는 Union 타입 typeof, keyof| 키워드 | 역할 | 예시 | 
|---|---|---|
typeof | JS 값 → 타입으로 바꿈 | typeof obj | 
keyof | 타입 → key 유니언 추출 | keyof T | 
const countryCurrency = {
	KOREA : "KRW",
  	USA : "USD",
  	CANADA : "CAD",
} as const;
type CountryCurrency = typeof countryCurrency
// type CountryCurrency = {
//    readonly KOREA: "KRW";
//    readonly USA: "USD";
//    readonly CANADA: "CAD";
// }
countryCurrency객체 자체를 리터럴(readonly)로 만들어버림
const countryCurrency = {
	KOREA : "KRW",
  	USA : "USD",
  	CANADA : "CAD",
} as const;
type KCountryCurrency = typeof keyof countryCurrency 
// type KCountryCurrency = "KOREA" | "USA" | "CANADA"
const countryCurrency = {
	KOREA : "KRW",
  	USA : "USD",
  	CANADA : "CAD",
} as const;
type VCountryCurrency = (typeof countryCurrency)[keyof typeof countryCurrency]
// type VCountryCurrency = "KRW" | "USD" | "CAD"