Blog
Mert Özen's blog posts on software development, backend, frontend, and DevOps.
What Is TypeScript and Why Does It Exist? The Type Layer on Top of JavaScript
We look at the type layer TypeScript adds on top of JavaScript, the difference between compile time and runtime, what type checking catches and what changed with TypeScript 7.
Setting Up TypeScript: Running Code Is Not the Same as Type-Checking It
The TypeScript Playground, installing with npm, tsc --init, npx tsc --noEmit and node file.ts on Node 26: why running code doesn't mean type-checking it, and how to read your first error message.
Type Inference and Annotations in TypeScript: When Do You Write the Type Yourself?
How TypeScript infers types on its own, the widening difference between let and const, why parameters get annotations, and when you should write a return type explicitly, with examples.
Basic and Special Types in TypeScript: any, unknown, never and void
Alongside string, number, boolean, bigint and symbol, we look at null and undefined in strict mode, why any is dangerous, how unknown makes it safe, and what void and never mean.
Array and Tuple Types in TypeScript: readonly, Optional Elements and Named Tuples
string[] versus the generic Array form, readonly arrays, fixed-length tuples, optional and rest elements, named tuples, and how the noUncheckedIndexedAccess setting changes reads by index.
Object Types in TypeScript: Optional and readonly Properties and Index Signatures
Inline object types, optional and readonly properties, index signatures, Record, and the fresh object literal rule behind excess property checking: why TypeScript only sometimes catches extra properties.
Type Aliases and Interfaces in TypeScript: Giving Your Types a Name
We give types names with type aliases and interfaces, compare extends with intersections, look at declaration merging, and cover when to pick which one and how to name them well.
Union and Literal Types in TypeScript: One Value, Several Possibilities
We cover 'either this or that' union types, literal types for fixed sets of values, why literals widen inside objects, a first look at as const, and why unions need narrowing.
Narrowing in TypeScript: Shrinking Unions with Control Flow Analysis
We see how TypeScript narrows unions through control flow analysis: typeof, truthiness, equality, in and instanceof checks, discriminated unions and exhaustive checks with never.
Typing Functions in TypeScript: Parameters, Return Types and Overloads
We cover parameter and return types, optional, default and rest parameters, function type expressions and call signatures, the subtlety of void returns, overloads and the this parameter.
Intersection and Structural Typing: How TypeScript Looks at Types
We look at structural typing, where TypeScript judges types by shape rather than name, the assignability rule, how it relates to excess property checking, and intersections that combine types with &.
Type Assertions, !, satisfies and as const in TypeScript: What to Tell the Compiler, and When
We look at what a type assertion with as does and doesn't check, the risk behind !, how satisfies from TS 4.9 checks while keeping the narrow type, and readonly literals with as const.