🎓 A1Learner
🔍
0 of 42 lessons completed

TypeScript Assertion Discipline

An assertion is a claim the checker trusts without proof, and disciplined code treats that trust as a last resort. The as const form is the safe everyday case because it narrows a value instead of inventing one.

as const keeps literal types

The roles array becomes a readonly tuple of literals. Reading its element type back gives the exact union of role names.

const roles = ['admin', 'editor', 'viewer'] as const;
type RoleName = (typeof roles)[number];
const current: RoleName = 'editor';
console.log(current);
console.log(roles.length);

A readonly tuple refuses push

The readonly part of as const is enforced by the checker. Adding a member to the tuple fails to compile.

const roles = ['admin', 'editor'] as const;
roles.push('viewer');
console.log(roles.length);

A wrong assertion compiles and lies

The assertion claims the string is a number, and the checker believes it. Addition follows string rules at runtime, and the typeof line exposes the lie.

const n = '5' as unknown as number;
console.log(n + 1);
console.log(typeof n);

A double assertion states a forced conversion

The runtime object really holds a numeric port, and only the checker cannot see it. Passing through unknown states the forced conversion openly.

const externalValue: object = { port: 8080 };
const settings = externalValue as unknown as { port: number };
console.log(settings.port);
console.log(typeof settings.port);

Example

const levels = ['basic', 'pro'] as const;
type LevelName = (typeof levels)[number];
function priceFor(level: LevelName): number {
  return level === 'pro' ? 20 : 0;
}
const settings = { level: 'pro', seats: 2 } as const;
console.log(priceFor(settings.level));
console.log(settings.seats);

Key points

  • The as const form makes a value readonly and keeps its exact literal types.
  • An array with as const becomes a readonly tuple of literals instead of a mutable array of wider types.
  • An assertion performs no runtime check and no runtime conversion.
  • Narrow first with real checks whenever a check can prove the shape.
  • Assert last, only for facts the checker cannot see but the code has already established.
  • A conversion across unrelated shapes must pass through unknown instead of a direct assertion.

In this example, as const keeps the level member at the literal pro, so the settings object passes straight into a function that accepts only the literal union.

Try it Yourself

Edit the code, then press Run.

Running is simulated · TypeScript Playground

Exercise

What does as const do to an array literal?