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.
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.”