해결된 질문
23.08.28 07:21 작성
·
137
1
Object를 Tuple로 변형관련해서 단계별로 말씀을 해주셨는데요..!
Values의 key를 반복문을 돌려서 Tuple로 만들어주는부분까지는 이해가 됐는데
type ValuesAsUnionOfTuples = {
[K in keyof Values]: [K, Values[K]];
};
다음 [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를 돌게 됩니다.
원하시는 답변이 되었는지 모르겠네요 😅
혹시 답변이 아직 안되셨다면 이 곳에 답글로 달아주세요!
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"가 되는 것입니다.
2023. 08. 28. 11:25
굉장히 빠른답변 너무나 감사합니다 :)
[K in 'foo' | 'baz']
가 되어서 Loop를 돌게 되는부분은 이해가되었으나type ValuesAsUnionOfTuples = { [K in keyof Values]: [K, Values[K]]; };
이경우에는 ValuesAsUnionOfTuples의 타입이 아래와 같이 나오는데
type ValuesAsUnionOfTuples = {
email: ["email", string];
firstName: ["firstName", string];
lastName: ["lastName", string];
}
type ValuesAsUnionOfTuples = { [K in keyof Values]: [K, Values[K]]; }[keyof Values]; 이렇게 하면
type ValuesAsUnionOfTuples = ["email", string] | ["firstName", string] | ["lastName", string]
1번에서 [keyof Values] 이부분만 넣어주면 ValuesAsUnionOfTuples 타입에서 value만 뽑아오는게 이해가 안되서요ㅠ
{ [K in keyof Values]: [K, Values[K]]; }[keyof Values] : {}이거 다음에 []이게 오는형태가 Object의 value를 뽑아오겠다는 의미일까요?