Type Guards and Narrowing
Typeof Guard
typeof checks narrow primitive unions before code uses type-specific operations.
typeof guard
`typeof value === "number"` tells TypeScript that the guarded branch has a number.
Typeof Guard
typeof.ts
Replay: real traced execution (multi-file project)
function describeValue(value: string | number): string {
if (typeof value === "number") {
return `number=${value * 2}`;
}
return `text=${value.toUpperCase()}`;
}
const useNumber: boolean = true;
const input: string | number = useNumber ? 7 : "ts";
const result: string = describeValue(input);
console.log(result);
function describeValue(value: string | number): string {
if (typeof value === "number") {
return `number=${value * 2}`;
}
return `text=${value.toUpperCase()}`;
}
const useNumber: boolean = false;
const input: string | number = useNumber ? 7 : "ts";
const result: string = describeValue(input);
console.log(result);
useNumber ← true, input ← 7
5 return `text=${value.toUpperCase()}`;6}78const useNumber→ true: boolean = true; //@useNumber=false9const input→ 7: string | number = useNumbertrue ? 7 : "ts";10const result: string = describeValue(input7);function describeValue(value: string | number): string
1function describeValue(value7: string | number): string {2 if (typeof value === "number") {result ← number=14
8const useNumber: boolean = true; //@useNumber=false9const input: string | number = useNumber ? 7 : "ts";10const result→ number=14: string = describeValue(input7);1112console.log(resultnumber=14);outputnumber=14
useNumber ← false, input ← ts
5 return `text=${value.toUpperCase()}`;6}78const useNumber→ false: boolean = false;9const input→ ts: string | number = useNumberfalse ? 7 : "ts";10const result: string = describeValue(inputts);function describeValue(value: string | number): string
1function describeValue(valuets: string | number): string {2 if (typeof value === "number") {3 return `number=${value * 2}`;4 }5 return `text=${valuets.toUpperCase()}`;6}result ← text=TS
8const useNumber: boolean = false;9const input: string | number = useNumber ? 7 : "ts";10const result→ text=TS: string = describeValue(inputts);1112console.log(resulttext=TS);outputtext=TS