TypeScript infers types from initializers, return statements, and context. You rarely need to annotate everything.
ts let blockNumber = 18_000_000; // inferred: number const chains = ["ethereum", "polygon"]; // inferred: string[] [1, 2, 3].map(n => n * 2); // n inferred as number from array element type
Contextual typing infers a parameter's type from where a function is used — in the `.map` example, `n` is `number` because the array is `number[]`, even though `n` has no annotation. Best-common-type inference figures out array element types from a mix of literals, and 'widening' converts literal types (`"ethereum"`) to their general type (`string`) unless declared with `const`.