Home / Articles / TypeScript does not turn weak engineering into strong engineering

This article is published in English.

TypeScript does not turn weak engineering into strong engineering

Strict types help, but any, bad boundaries, and untested domain rules still ship—craft beats syntax.

804 words

Type safety isn’t the same as software quality

TypeScript prevents an important class of bugs. It does not prevent weak design, unclear domain models, or sloppy runtime behavior.

function transferMoney(
  from: Account,
  to: Account,
  amount: number
) {
    from.balance -= amount;
    to.balance += amount;
}
const user: any = fetchUser();
user.address.street.foo.bar();
interface User {}
interface UserResponse {}interface UserData {}interface UserDTO {}interface UserPayload {}interface UserState {}

TypeScript doesn’t understand business logic

Compilers cannot know whether a discount stacking rule is fair. Types track shapes; humans still owe tests and invariants.

The most dangerous type is any

any disables the partner you adopted the compiler for. Prefer unknown + narrowing, or precise unions.

Strong types can’t save weak architecture

Layering, boundaries, and module seams matter more than decorating a ball-of-mud with interfaces.

Types describe reality

Models should match the domain. Lying types that claim non-null where APIs return null create false confidence.

Bad habits scale faster in TypeScript

Copy-paste DTOs, oversized god types, and assertion spam spread quickly under a veneer of “typed.”

The best TypeScript developers were already careful JavaScript developers

Discipline precedes syntax. TS amplifies habits—good and bad.

Use the compiler as a partner

Turn on strictness, fix root causes, and let errors guide refactors instead of silencing them.

The real upgrade isn’t TypeScript

The upgrade is clearer modules, tested domain rules, and honest types. TypeScript is tooling for that craft—not a substitute.

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”

Enable noImplicitAny and strictNullChecks before debating style guides; those two flags catch more real bugs than naming conventions.

Pair DTOs at boundaries with mappers—don’t leak persistence shapes into UI components just because both are “typed.”