개발자

TS 고수님, TS에서 타입 캐스팅 'as', 이렇게 이해해도 될까요

2024년 03월 14일조회 66

안녕하세요, 타입스크립트 고수님들에게 타입스크립트의 키워드 "as"에 대해서 문의 드립니다. 관건은 'as' 인데요 as의 의미를 다음의 순서대로 풀어보았습니다. 아래 코드에서 as의 역할/의미를 아래 순서대로 이해하는게 맞을까요? (=똑 떨어지는 설명이 없다보니, 나름 의미를 풀어서 이해해봤습니다.) 1.*[k in keyof O as O[K] 만약 k가 k in keyof o의 첫번째 값으로 'who'가 들어오고, 텍스트 'who'를 타입을 string이라고 합니다(as는 왼쪽의 값을 오른쪽의 값으로 '간주'하기 때문에) 라고 종종 서적에서 볼 수 있습니다. 2.*k in keyof O == O[K] 저는 as를 "=="이라고 이해하는데요, who(k in keyof O)는 string이라는 타입값이라고 간주합니다(=who는 string 입니다 라는 확정적인 의미가 아니라, "이렇게 할래" 이런 어조로 말입니다.) 3.[핵심!] who ==(비슷하다라고 간주하다) string 이기 때문에, who를 쓰는건 곧 "잠재적?"으로 string이라고 이해해도 될까요??.. (즉, who라고 쓰고 who라는 자리에 타입 string이라고 읽는다..처럼 말이죠...) 4.*who(==string) extends T(number) ? never : K(who) 텍스트 who는 곧(==) string 타입이기 때문에, 3번에서 말한 것처럼, who의 타입은 string이기 때문에 never가 아닌, K즉 who로 종료된다 요약하면, as를 쓰면 위 코드 상에서는 2가지 의미가 떠오르는데요, 1.k라는 텍스트를 o[k]의 타입으로 바인딩을 시키고 2.k는 o[k]라는 타입을 갖게 되어(= 타입 캐스팅), k를 사용하는 건 곧, k의 타입 o[k]를 사용하는 것이다 라고 이해했습니다. k라고 쓰고 o[k]라고 읽는 다 처럼 말이죠, as가 as 이하의 타입으로 "만든다" 라고만 생각하면, 위의 3번 내용이 생각이 나질 않습니다. 아래 코드에서 as를, 코드"순서대로" 이해해보려 하니 조금은 억지스러운 면이 있었지만, 조금은 컴퓨터 답게? as를 제대로 이해하고 있는지 고수님들에게 조언을 듣고 싶습니다! 감사합니다!

1type OmitExample<O,T> = {[k in keyof O as O[K] extends T ? never : K ]: O[k] }
2
3type OmitResult = OmitExample<{
4	who:string;
5	when:number;
6	where:number;
7	what:boolean;
8}, number >
9
10/* type OmitResult = {
11    [x: string]: string | boolean;
12} */
13
14k in keyof o   //  k는 who | when | where | what 의 string 배열이고,
15o[k]  //  타입 OmitExample의 첫번째 인수로 들어온 객체의 키 who, when, where, what의 값,
이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

포크코딩님의 프로필 사진

수학자처럼 코딩하시는 분인거 같네요. 오랜만에보니 반갑습니다. 타입 스크립트에서 as는 캐스팅 같은 특별한 기능을 하거나 그러진 않습니다. 그냥 컴파일러에게 힌트를 제공해 주는 매크로 같은 키워드죠. 컴퓨터 같은 사고를 떠나서 의미하는 바는 영어 그대로입니다. 한국말로 하면 '~로 (여기다)'입니다. 예를 들어, 'A as B라고 하면 A라는 값을 B라는 타입으로 여기겠다'입니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 03월 14일

타입스크립트의 `as` 키워드는 타입 단언(type assertion)을 합니다. 이는 개발자가 더 정확한 정보를 가지고 있음을 컴파일러에게 알리는 방법입니다. 코드에서 특정 값이 어떤 특정 타입임을 하드 코딩으로 지정할 때 사용하는 것이죠. 하나하나 다시 보면, 1.*[k in keyof O as O[K] 여기서 `as` 는 타입스크립트 4.1에서 추가된 기능인 Key Remapping입니다. 기본적으로 k가 O 객체의 모든 키를 순환하는데, 그 키를 다른 형태로 변형해서 새로운 오브젝트를 만드는 것이죠. 2.*k in keyof O == O[K] 여기서 as은 '=='와 같은 의미는 아닙니다. 이해하신 내용이 조금 혼동되신 것 같아요. '=='라기보다 각 키 k를 순환하며 해당 키(k)의 속성값(O[K])의 타입에 따라 적절한 처리를 하겠다는 논리적 구문입니다. 3.[핵심!] who ==(비슷하다라고 간주하다) string '=='보다는 "who가 가리키고있는"이나 "가진" 이라고 해석하는 것이 좋겠습니다. 여기선 "who라는 키가 가진 속성값이"란 의미로 해석하는 게 맞을 것 같아요. 4.*who(==string) extends T(number) ? never : K(who) 여기서 extends는 조건문으로, O[K] 즉 'who'의 타입이 T('number')와 같은지 비교하고 그에 따라 타입을 결정합니다. 요약하면 `as` 는 키 리맵핑과 더불어 개발자가 컴파일러에게 해당 값의 타입을 단언하는 역할을 합니다. 이로 인해 타입스크립트 내부에서 강력한 제어를 가능하게 합니다. 따라서 `as`를 사용할 때는 우리가 이 변수/값의 실제 타입에 대해 확신할 수 있을 때만 사용해야 합니다. 그렇지 않으면 런타임 에러의 원인이 될 수 있습니다. 여기서 중요한 점은 꼭 필요한 경우가 아니라면 `as` 사용은 최대한 자제하시는 것이 좋습니다. 왜냐하면 컴파일러의 타입 체킹 기능 일부를 건너뛰게 만들기 때문입니다. 가능하다면 함수 인자나 반환값 등 명시적으로 타입을 지정해주는 방법을 사용하는 것이 좋습니다. 마지막으로 `[k in keyof O as O[K]` 에서 `as`를 이해하는 가장 쉬운 방법은 각<Key, Value> 쌍을 순환하면서 Key는 그대로 두고, Value는 타입 체크를 통해 변경되어 새로운 객체에 투영하는 것이라고 생각하시면 됩니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!