TypeScript: 'Type null is not assignable to type...' 엄격한 Null 체크 에러와 3가지 예외 처리법
- 원인:
strictNullChecks가 켜져 있으면,null을 허용하지 않은 타입 변수에null이 섞일 수 있는 값을 대입하려 할 때 컴파일러가 막음 - 해결: 속성 접근은 옵셔널 체이닝(
?.) / 기본값이 필요하면 널 병합(??) / 100% 값이 있다고 확신하면 Non-Null 단언(!) - 주의:
!단언은 컴파일러 경고를 강제로 끄는 것이라, 실제로 값이 없으면 그대로 런타임 에러로 이어짐 — 남용 금지
const displayName: string = user?.name ?? "비회원";
↓ 왜 이런 에러가 나는지 원리 보기
비동기로 데이터를 받아오거나 DOM 요소를 다룰 때 TypeScript가 'Type null is not assignable to type...' 에러를 띄우는 경우가 있습니다. strictNullChecks 옵션이 왜 이런 경고를 내는지와, 실무에서 자주 쓰는 예외 처리 방법 세 가지를 정리합니다.
왜 'Type null is not assignable' 에러가 발생하는가
이 에러가 표시되는 주범은 타입스크립트의 핵심 옵션인 strictNullChecks가 활성화되어 있기 때문입니다. 기존 자바스크립트는 값이 비어있는 null이나 undefined 상태의 객체 속성에 접근할 때 런타임 오류(TypeError: Cannot read properties of null)를 일으키며 프로그램이 중단됩니다. 타입스크립트는 이를 컴파일 시점에 미리 잡아내기 위해, 명시적으로 null을 허용(Union Type)하지 않은 일반 타입 변수에는 null 값을 아예 대입할 수 없도록 강제 차단합니다. API 응답이 아직 안 왔거나 실패했을 때의 초기값을 null로 잡아두는 패턴에서 이 에러를 가장 많이 만나게 됩니다.
let userName: string = null;
// 에러: Type 'null' is not assignable to type 'string'.
기존 자바스크립트에서는 값이 null인 상태로 user.name처럼 속성에 접근하면 그 즉시 런타임 크래시로 이어집니다. 타입스크립트 컴파일러는 타입에 null이 섞여 있으면 코드 단계에서 미리 경고해 예외 처리(가드)를 강제로 유도함으로써 이런 런타임 크래시를 사전에 막아줍니다.
'Type null is not assignable' 에러 해결책 3가지
방법 A: 옵셔널 체이닝(Optional Chaining - ?. ) 사용하기
객체의 값이 null 또는 undefined일 수 있는 상황에서 속성을 안전하게 탐색하게 해 주는 가장 범용적인 해결 방법입니다. 객체가 비어있다면 속성 접근을 멈추고 즉시 undefined를 반환합니다.
interface User {
name: string;
}
// user 데이터가 서버로부터 로드되기 전에는 null 상태일 수 있음
let user: User | null = null;
// 에러: Object is possibly 'null'.
console.log(user.name);
// 해결: ?. 연산자를 사용하여 안전하게 참조
console.log(user?.name); // user가 null이면 에러 없이 undefined 출력
방법 B: 널 병합 연산자(Nullish Coalescing - ?? )로 기본값 지정하기
데이터가 null이어서 반환값이 비어있을 때, 이를 대체할 안전한 기본 값(Fallback)을 설정하는 방법입니다.
let user: { name: string } | null = null;
// 에러: Type 'string | undefined' is not assignable to type 'string'.
const displayName: string = user?.name;
// 해결: ?? 연산자로 null/undefined일 때 적용할 기본 문자열 지정
const displayNameSafe: string = user?.name ?? "비회원";
console.log(displayNameSafe); // "비회원" 출력
방법 C: Non-Null 단언 연산자(Non-null Assertion Operator - ! ) 활용
타입스크립트 컴파일러는 객체가 비어있을 수 있다고 경고하지만, 개발자가 논리적으로 "이 값은 무조건 데이터가 들어있다"고 보장할 수 있을 때 사용하는 방식입니다. 컴파일러의 간섭을 강제로 끕니다. (예외가 발생할 경우 크래시 위험이 있으므로 주의해서 사용해야 합니다.)
// React에서 useRef로 DOM 요소를 지정할 때 주로 활용됩니다.
const inputRef = useRef<HTMLInputElement | null>(null);
const handleFocus = () => {
// inputRef.current가 마운트 시점에 존재함을 개발자가 보장 (!)
inputRef.current!.focus();
};
자바스크립트 프로젝트를 타입스크립트로 전환하던 중, useRef를 쓰는 곳마다 !를 습관적으로 붙이다가 조건부로 렌더링되는 모달 내부의 ref에도 똑같이 붙여서 실제로 null인 상태에서 .focus()를 호출해 런타임 에러를 낸 적이 있습니다. 컴파일러가 막아주던 걸 !로 직접 풀어버렸으니 당연한 결과였는데, 그 뒤로는 마운트가 확실히 보장되는 ref에만 !를 쓰고 나머지는 ?.로 바꿨습니다.
요약: Null 예외 처리 제어 매트릭스
컴파일 에러를 해결하기 위한 예외 제어 요약 테이블입니다.
| 상황 | 잠재적 위협 | 대응할 기법 |
|---|---|---|
| 단순 객체 속성 참조 | 런타임 프로퍼티 탐색 시 크래시 유발 위험 | 옵셔널 체이닝 (?.) |
| 비어있는 상태 대체용 UI 노출 | 빈 값(undefined)이 사용자 화면에 지저분하게 노출됨 | 널 병합 연산자 (??) |
| DOM 맵핑 등 100% 할당 확신 | 불필요한 컴파일러의 반복적인 에러 경고 띄움 | Non-Null 단언 (!) |
strictNullChecks 옵션과 Nullable 타입 처리는 공식 문서에서 더 자세히 확인할 수 있습니다.
세 가지 방법 중 어떤 걸 쓸지는 '값이 없을 가능성을 어떻게 다룰지'에 달려 있습니다. non-null 단언(!)은 편하지만 실제로 값이 없을 때는 그대로 런타임 에러로 이어지므로 남용하지 않는 게 좋습니다.
댓글
댓글 쓰기