인프런 커뮤니티 질문&답변

simjieun님의 프로필 이미지

작성한 질문수

실전 연습으로 익히는 고급 타입스크립트 기술

Object 타입 변형 > Object를 Tuple로 변형 관련 질문드려요!!

해결된 질문

23.08.28 07:21 작성

·

137

1

Object를 Tuple로 변형관련해서 단계별로 말씀을 해주셨는데요..!

  1. Values의 key를 반복문을 돌려서 Tuple로 만들어주는부분까지는 이해가 됐는데

type ValuesAsUnionOfTuples = {
  [K in keyof Values]: [K, Values[K]];
};
  1. 다음 [keyof Values]를 해주는 부분에 대한 설명을 조금더 자세히 해주실수있을까 싶어서 문의드렸습니다!!

type ValuesAsUnionOfTuples = {
  [K in keyof Values]: [K, Values[K]];
}[keyof Values];

답변 1

0

애프터캠프님의 프로필 이미지
애프터캠프
지식공유자

2023. 08. 28. 09:02

안녕하세요 simjieun님!

keyof 는 Object 타입에서만 사용할 수 있는 키워드인데요.

예를 들어,

interface Values {
 foo: 'bar',
 baz: 'fooz'
}
type KeyOfValues = keyof Values;
// 'foo' | 'baz'

Values 의 타입에 keyof 를 사용하게 되면 KeyOfValues 라는 타입은 Values의 key (foo, baz)의 Union가 됩니다.

그래서

[K in keyof Values] 를 풀어서 설명드리면 앞서 말씀드린대로 keyof Values은 Union 타입이니까

[K in 'foo' | 'baz'] 가 되어서 Loop를 돌게 됩니다.

원하시는 답변이 되었는지 모르겠네요 😅

혹시 답변이 아직 안되셨다면 이 곳에 답글로 달아주세요!

 

simjieun님의 프로필 이미지
simjieun
질문자

2023. 08. 28. 11:25

굉장히 빠른답변 너무나 감사합니다 :)

[K in 'foo' | 'baz'] 가 되어서 Loop를 돌게 되는부분은 이해가되었으나

  1. type ValuesAsUnionOfTuples = { [K in keyof Values]: [K, Values[K]]; };
    이경우에는 ValuesAsUnionOfTuples의 타입이 아래와 같이 나오는데

    type ValuesAsUnionOfTuples = {
    email: ["email", string];
    firstName: ["firstName", string];
    lastName: ["lastName", string];
    }

  2. type ValuesAsUnionOfTuples = { [K in keyof Values]: [K, Values[K]]; }[keyof Values]; 이렇게 하면

    type ValuesAsUnionOfTuples = ["email", string] | ["firstName", string] | ["lastName", string]

    1. 1번에서 [keyof Values] 이부분만 넣어주면 ValuesAsUnionOfTuples 타입에서 value만 뽑아오는게 이해가 안되서요ㅠ

    2. { [K in keyof Values]: [K, Values[K]]; }[keyof Values] : {}이거 다음에 []이게 오는형태가 Object의 value를 뽑아오겠다는 의미일까요?

 

 

 

애프터캠프님의 프로필 이미지
애프터캠프
지식공유자

2023. 08. 28. 13:27

네 정확하게 어려워 하시는 부분을 알겠네요.

우선

type Foo = {
  "foo": "bar",
  "baz": "baz"
}["foo"]

이런 타입이 있다고 했을 때 Foo의 타입은 어떻게 되나요?

답은 "bar"입니다.

하지만 여기서 "foo"가 아니라 "foo" | "baz" 를 넘기게 되면 (이것과 관련된 용어는 Indexed Access Types 라고 합니다!)

답은 "bar" | "baz" 가 됩니다. (이것과 관련된 용어는 string literals 입니다!)

이게 왜 이렇게 되느냐를 말로 풀어보면

Object 타입에 특정 키로 접근하면 value type이 리턴되는 것은 알겠고, 만약에 키들의 Union 타입을 넘기게 되면 ("foo" | "baz"), 둘 중에 하나의 값으로 (foo 또는 baz) 접근하는데 결과는 foo를 넘겼다면 "bar"가, baz를 넘겼다면 "baz"가 리턴될 것이다. 어떤 값을 넘겼느냐에 따라 결과가 다른데 가능한 결과가 총 2가지이니까 결국 "bar" | "baz"가 되는 것입니다.

 

simjieun님의 프로필 이미지
simjieun
질문자

2023. 08. 28. 13:29

와.. 명쾌한 답변 너무나 감사합니다!!

이제 완벽히 이해됐어요!!!😁👍

simjieun님의 프로필 이미지

작성한 질문수

질문하기