후위 !는 컴파일러에게 "이 값이 여기서 null이나 undefined가 아님을 보증한다"고 말합니다 — 런타임 검사 없이 그 타입에서 null/undefined를 제거합니다.
ts
function f(?: ) {
.(name!.());
}
후위 !는 컴파일러에게 "이 값이 여기서 null이나 undefined가 아님을 보증한다"고 말합니다 — 런타임 검사 없이 그 타입에서 null/undefined를 제거합니다.
function f(?: ) {
.(name!.());
}
순수하게 컴파일 타임 단언입니다 — as처럼 런타임 검증을 전혀 하지 않습니다. 틀리면 크래시합니다:
const el = document.getElementById("app")!; // non-null 단언
el.innerHTML = "hi"; // 💥 #app이 실제로 없으면 런타임 오류
// 1. 논리적으로 보증했지만 컴파일러가 알 수 없을 때
if (map.has(key)) map.get(key)!.doThing(); // has()가 get()이 undefined 아님을 증명
// 2. constructor 밖에서 초기화되는 클래스 필드 (DI, 라이프사이클 훅)
class C { value!: string; } // definite assignment 단언
name?.toUpperCase(); // optional chaining — 크래시 없이 undefined를 산출
const x = name ?? "default"; // 폴백 제공
if (name) name.toUpperCase(); // 실제 검사로 narrowing
이들 각각은 없는 경우를 단언으로 치워버리는 대신 처리합니다.
!는 날카로운 도구입니다: 컴파일러가 주려는 null 안전성을 입막음합니다.
때때로 정당화됩니다(컴파일러가 갖지 못한 지식을 당신이 가질 때). 하지만 남용하면 strictNullChecks가 막는 null 크래시 버그를 정확히 다시 들여옵니다.
먼저 ?., ??, 또는 명시적 가드에 손을 뻗고, non-null을 진짜로 증명할 수 있을 때만 !를 사용하세요.