이중 단언과 위험성
as unknown as T가 필요한 경우와 이것이 위험한 이유를 알아봅니다.
이중 단언과 위험성은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
이중 단언이란 무엇인가
이중 단언은 보통 unknown을 거쳐 두 번의 as 형 변환을 연결합니다: value as unknown as T. 컴파일러가 그렇지 않으면 거부할 변환을 강제로 수행합니다.
const s = 'hello';
const n = s as unknown as number; // forced
console.log(typeof n); // still 'string' at runtime!TS가 직접 형 변환을 차단하는 이유
string과 number가 서로 겹치지 않을 때 TypeScript는 s as number를 차단합니다. 이는 거의 확실히 실수이기 때문입니다. 이 오류는 무의미한 단언으로부터 보호해 줍니다.
const s = 'text';
// const n = s as number; // Error: types do not sufficiently overlap
console.log('Direct unrelated assertion is rejected');unknown이 형 변환을 가능하게 하는 방식
모든 타입은 unknown에 할당할 수 있고, unknown은 어떤 타입으로든 단언할 수 있습니다. unknown을 거치면 두 단계로 겹침 규칙을 충족하여 안전 검사를 완전히 우회하게 됩니다.
const s = 'text';
const step1 = s as unknown; // always allowed
const step2 = step1 as number; // allowed from unknown
console.log(typeof step2);이중 단언은 컴파일러를 속입니다
코드는 컴파일되지만 실행 시 값은 변하지 않습니다. 타입 시스템에 거짓을 알려 준 것입니다. 이후 코드가 단언된 타입을 신뢰하면 예측할 수 없이 오작동할 수 있습니다.
const fake = 'oops' as unknown as number;
console.log(fake + 1); // 'oops1' — string concatenation at runtime현실적인 오용 사례
개발자는 구조가 일치하지 않을 때 오류를 없애기 위해 이중 단언을 사용하기도 합니다. 이는 실제 버그를 숨깁니다. 해당 값에는 주장한 속성이 실제로 존재하지 않기 때문입니다.
type User = { id: number; name: string };
const partial = { id: 1 };
const user = partial as unknown as User;
console.log(user.name); // undefined at runtime이중 단언이 필요한 경우
때로는 정당한 경우도 있습니다. 예를 들어 실행 시 구조적으로 호환된다는 사실을 알고 있는 호환되지 않는 라이브러리 타입을 연결하거나, 메모리 배치를 실제로 알고 있는 저수준 코드에서 사용할 수 있습니다. 하지만 이런 경우는 드뭅니다.
// Bridging a known-compatible external type:
type LibA = { value: number };
type LibB = { value: number };
const a: LibA = { value: 5 };
const b = a as unknown as LibB; // structurally identical
console.log(b.value);이것이 코드 악취인 이유
이중 단언은 타입 시스템과 협력하기보다 이를 무시하고 있다는 신호입니다. 각각의 이중 단언은 컴파일러가 더 이상 보호해 줄 수 없는 지점이므로, 검토자는 모든 사용 사례를 면밀히 살펴봐야 합니다.
// Treat 'as unknown as' as a red flag in code review.
const data: unknown = JSON.parse('{}');
// Better: validate with a type guard instead of forcing.
console.log('Prefer validation over double assertion');검증을 우선하십시오
타입을 강제로 지정하는 대신 데이터를 검증하고 타입 범위를 좁히십시오. 타입 가드는 실행 시 구조를 증명하므로 컴파일러에 거짓을 알리지 않고도 같은 타입 지정 결과를 얻을 수 있습니다.
type User = { id: number; name: string };
function isUser(v: unknown): v is User {
return typeof v === 'object' && v !== null &&
'id' in v && 'name' in v;
}
const raw: unknown = { id: 1, name: 'Sam' };
if (isUser(raw)) console.log(raw.name);올바른 변환을 우선하십시오
실제로 실행 시 다른 타입이 필요하다면 단언하지 말고 값을 변환하십시오. 변환은 데이터를 바꾸지만, 단언은 표시만 바꿉니다.
const s = '42';
const n = Number(s); // real conversion
console.log(n + 1, typeof n);드문 유효 사례를 문서화하십시오
이중 단언이 정말 정당하다면 안전한 이유를 설명하는 주석을 추가하십시오. 이후 코드를 유지 관리하는 사람은 해당 형 변환을 타당하게 만드는 실행 시 보장을 알아야 합니다.
type Raw = { ts: number };
type Event = { ts: number };
const raw: Raw = { ts: 100 };
// Safe: Raw and Event are structurally identical.
const ev = raw as unknown as Event;
console.log(ev.ts);지침 요약
경험 법칙은 다음과 같습니다. as unknown as를 작성하고 있다면 잠시 멈추고, 검증이나 변환이 더 안전한지 물어보십시오. 열 번 중 아홉 번은 검증이나 변환이 더 안전합니다.
// Decision: validate? convert? or genuinely bridge identical types?
const input = '7';
const parsed = Number.parseInt(input, 10); // convert, don't force
console.log(parsed);빠른 확인
이중 단언에 대한 이해도를 확인해 보십시오.
복습: 이중 단언
다음 내용을 배웠습니다:
value as unknown as T는 TypeScript가 그렇지 않으면 거부할 형 변환을 강제로 수행합니다.unknown이 모든 타입과 겹치기 때문에 작동하지만, 실행 시에는 아무것도 바꾸지 않습니다.- 이는 코드 악취입니다. 타입 시스템을 무시하여 타입 시스템의 보호를 잃기 때문입니다.
- 대신 검증(타입 가드)이나 실제 변환을 우선하십시오.
다음으로 단언과 타입 가드를 정면으로 비교합니다.
// Validate, don't force:
const raw: unknown = '99';
const n = typeof raw === 'string' ? Number(raw) : 0;
console.log(n);자주 묻는 질문
“이중 단언과 위험성” 강의는 무료인가요?
네 — “이중 단언과 위험성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“이중 단언과 위험성”에서 뭘 배우나요?
as unknown as T가 필요한 경우와 이것이 위험한 이유를 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“이중 단언과 위험성” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.