Eliminierung technischer Schulden mit PHPStan, Rector PHP und PHPUnit. Über 20 Jahre Praxiserfahrung in skalierbaren Backends.
- Aktualisiert:
- Autor:
- Roland Golla
Was ist der Unterschied zwischen unknown und any?
function mitAny(wert: any) {
wert.toUpperCase(); // kompiliert, kracht bei einer Zahl
}
function mitUnknown(wert: unknown) {
wert.toUpperCase();
// Fehler: 'wert' is of type 'unknown'.
if (typeof wert === "string") {
wert.toUpperCase(); // hier ist es sicher
}
}
Inhalt
unknown statt any mit NCA: Schnelle Hilfe vom Experten
Never Code Alone arbeitet seit über 20 Jahren an Softwarequalität. Unser Frontend Stack aus Astro, React und Vue läuft durchgehend typisiert in Production, Type Checking ist Pflichtschritt in jeder Pipeline. Ein any im Code ist bei uns kein Stilthema, sondern ein Review Befund mit Begründungspflicht. Genau dieselbe Haltung fahren wir im Backend mit PHPStan auf Maximallevel und Type Coverage.
In deinem Projekt heißt das konkrete Arbeit. Wir führen den strict Mode in gewachsenen Codebasen ein, ersetzen any Stück für Stück durch geprüfte Typen und machen mit AI Slop Refactoring KI generierten Code produktionsreif. Im Vibe Coding Consulting verankern wir die Regel dort, wo sie wirkt: in den Quality Gates und den Vibe Coding Best Practices.
TypeScript Projekt absichern
Finde das passende Angebot für dein Projekt
Anfrage-Konfiguration
Starten Sie Ihre Anfrage
Gesetzliche Konformität & Inklusion. Optimierung von Performance und Conversion durch radikal nutzerzentriertes, universelles Design.
Skalierbare KI-Systeme mit echtem Code Ownership. CI/CD, Backup-Strategien und Infrastruktur, die mit deinem Team wächst.
Anfrage-Konfiguration
Worauf liegt dein Fokus?
Wähle die Expertise, die dein Projekt jetzt am dringendsten benötigt.
Was any wirklich macht: der Compiler schaut weg
const user: any = ladeNutzer();
user.name.toUpperCase();
user.profil.adresse.strasse;
user.istAktiv();
user + 1;
// Alles kompiliert. Keine einzige dieser Zeilen ist geprüft.
// Ohne noImplicitAny: kein Fehler, aber kein Schutz
function formatiere(wert) {
return wert.trim();
}
formatiere(42); // kracht zur Laufzeit
unknown: alles darf rein, aber nichts ohne Prüfung raus
function verarbeite(wert: unknown) {
if (typeof wert === "string") {
return wert.trim();
}
if (typeof wert === "number") {
return wert.toFixed(2);
}
if (wert instanceof Date) {
return wert.toISOString();
}
return "Unbekannter Wert";
}
type Nutzer = { name: string; email: string };
function istNutzer(wert: unknown): wert is Nutzer {
return (
typeof wert === "object" &&
wert !== null &&
"name" in wert &&
"email" in wert
);
}
function begruesse(wert: unknown) {
if (istNutzer(wert)) {
return "Hallo " + wert.name;
}
throw new Error("Kein gueltiger Nutzer");
}
any, unknown, never und konkrete Typen im Vergleich
| Typ | Was du zuweisen darfst | Was du damit tun darfst |
|---|---|---|
| any | Jeden Wert | Alles, ohne jede Prüfung |
| unknown | Jeden Wert | Nichts, bis der Typ eingegrenzt ist |
| never | Nichts | Nichts, der Fall darf nicht eintreten |
| string, Nutzer, Union | Nur passende Werte | Alles, was der Typ hergibt |
Praxis 1: der Fehler im catch Block
try {
await speichere(daten);
} catch (fehler) {
// fehler ist unknown
if (fehler instanceof Error) {
logge(fehler.message);
} else {
logge("Unbekannter Fehler: " + String(fehler));
}
}
Praxis 2: Daten aus dem Netz und aus JSON.parse
const antwort = await fetch("/api/nutzer");
const daten = await antwort.json(); // any
// Sieht sauber aus, ist aber ungeprüft:
zeigeName(daten.name);
const daten: unknown = await antwort.json();
if (istNutzer(daten)) {
zeigeName(daten.name);
} else {
throw new Error("Unerwartete API Antwort");
}
Warum any der häufigste Fund in KI generiertem Code ist
# Ausschnitt aus AGENTS.md
## TypeScript
- Kein `any`. Fremde Daten sind `unknown` und werden geprueft
- `as` nur mit Kommentar und Begruendung
- Fehler im catch Block sind `unknown`
- Vor jedem Commit: npx tsc --noEmit
any aus einer gewachsenen Codebase entfernen
// tsconfig.json: Stufe fuer Stufe schaerfen
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"useUnknownInCatchVariables": true
}
}
Wann any trotzdem in Ordnung ist
A new top type unknown which is the type-safe counterpart of any.
Aus der NCA Praxis: eine Zeile Regel, die viele Fehler erspart
Kein any im Projektcode, fremde Daten sind unknown und werden an der Grenze geprüft. Diese eine Regel entfernt mehr Laufzeitfehler als jede zusätzliche Testsuite, und sie ist in zehn Minuten eingeführt. Die passenden Bausteine dazu stehen im NCA TypeScript Glossar: der never Type für vollständige Fallunterscheidungen und satisfies für geprüfte Konfiguration. Die Einordnung der Sprache insgesamt steht im TypeScript Glossareintrag, der Weg zum strict Mode mit Astro daneben.
Im Backend gilt dasselbe Prinzip mit anderen Werkzeugen. PHPStan, Psalm und Rector halten Symfony Projekte sauber. Wer mit Agenten arbeitet, findet die Auswahl in den Vibe Coding Modellen, etwa OpenCode. Sicherheitsfragen behandeln wir unter Vibe Coding Security, festgefahrene Projekte bringt Vibe Coding Projekt retten wieder in Gang, und Teams schulen wir im KI Training für Entwicklerteams.
Frontend 2025: Optimieren Sie Ihre Webseite mit Astro JS und nutzen Sie die Vorteile der Barrierefreiheit
Optimieren Sie Ihre Webseite mit Astro JS und nutzen Sie die Vorteile einer schnellen, sicheren und barrierefreien Webseite. Erfüllen Sie die gesetzlichen Anforderungen und verbessern Sie die Benutzererfahrung Ihrer Webseite. Mit Astro JS können Sie die Ladezeit reduzieren, die Sicherheit maximieren und die SEO-Optimierung verbessern. Kontaktieren Sie uns, um mehr zu erfahren und um Ihre Webseite auf ein neues Level zu heben.
Häufige Fragen zu unknown und any
Was ist 2026 der Unterschied zwischen unknown und any?
Beide Typen nehmen jeden Wert an. Der Unterschied liegt beim Zugriff. Mit any darfst du sofort jede Operation ausführen, ohne dass TypeScript prüft. Mit unknown erlaubt der Compiler gar nichts, bis du den Typ eingegrenzt hast. any schaltet die Prüfung ab, unknown verschiebt sie an die Stelle, an der du tatsächlich weißt, was im Wert steckt.
Wann sollte ich 2026 unknown statt any verwenden?
Als Standard immer dann, wenn der Typ zur Schreibzeit unbekannt ist. Das betrifft API Antworten, JSON.parse, Formulardaten, Nachrichten aus Message Queues und Fehler im catch Block. In all diesen Fällen ist unknown die ehrliche Beschreibung der Lage und zwingt dich zu genau einer Prüfung an der richtigen Stelle.
Ist any 2026 grundsätzlich verboten?
Nein, aber begründungspflichtig. Es gibt Ausnahmen: Tests mit absichtlich kaputten Mocks oder der Zugriff auf eine alte Library ohne Typdefinitionen. Entscheidend ist die Begrenzung auf eine klar markierte Stelle mit Kommentar. Problematisch wird any erst, wenn es in Signaturen steht und sich von dort durch die Codebase ausbreitet.
Wie erkenne ich 2026 verstecktes any im Projekt?
Mit noImplicitAny in der tsconfig.json. Ohne diese Option sind Parameter ohne Typannotation stillschweigend any, obwohl im Code nirgends any steht. Nach dem Einschalten zeigt der Compiler alle betroffenen Stellen auf einmal. Diese Zahl ist ein guter Startwert für ein Refactoring, weil sie den Fortschritt messbar macht.
Hilft unknown 2026 gegen Fehler in KI generiertem Code?
Ja, an einer sehr konkreten Stelle. KI Agenten greifen zu any, wenn ein Typfehler den Weg zum kompilierenden Code versperrt. Der Fehler verschwindet damit aus der Anzeige, nicht aus dem Programm. Eine Regel in der AGENTS.md plus noImplicitAny und eine Linter Regel machen aus der Vorgabe eine Prüfung, die der Rechner durchsetzt.
Wie grenze ich einen unknown Wert ein?
Mit den Mitteln, die JavaScript ohnehin hat. typeof für primitive Typen, instanceof für Klassen und Date, der in Operator für Objektfelder. Für komplexere Strukturen schreibst du eine Type Guard Funktion mit dem Rückgabetyp wert is Nutzer. Der Compiler übernimmt danach die Annahme und lässt dich mit dem konkreten Typ weiterarbeiten.
Warum liefert JSON.parse any statt unknown?
Das ist eine historische Entscheidung in den Typdefinitionen der Standardbibliothek. Eine Umstellung auf unknown wäre für unzählige Projekte ein Bruch. Praktisch löst du es selbst, indem du das Ergebnis explizit als unknown deklarierst und anschließend validierst. Eine Zeile, die den Rest der Anwendung vor ungeprüften Daten schützt.
Reicht eine Type Guard für Daten aus einer API?
Für einfache Fälle ja, für echte Schnittstellen selten. Eine handgeschriebene Prüfung testet meist nur, ob Felder vorhanden sind, nicht ob deren Typen stimmen, und sie veraltet mit jeder Änderung am Schema. Für Daten aus dem Netz gehört an die Systemgrenze eine Schema Validierung, die zur Laufzeit prüft und den passenden Typ gleich mitliefert.
Was ist der Unterschied zwischen unknown und never?
unknown ist der Typ, dem alles zugewiesen werden darf und mit dem nichts erlaubt ist, bis geprüft wurde. never ist das Gegenteil: Ihm darf gar nichts zugewiesen werden. never markiert Fälle, die nicht eintreten dürfen, und ist deshalb das Werkzeug für vollständige Fallunterscheidungen bei Union Types.
Kostet unknown zur Laufzeit Performance?
Der Typ selbst nicht, er existiert nur beim Kompilieren. Was Laufzeit kostet, sind die Prüfungen, die du dadurch schreibst, also typeof Abfragen oder eine Schema Validierung. Diese Kosten fallen an genau den Stellen an, an denen sonst ungeprüfte Daten durchlaufen würden, und sind in jedem realistischen Szenario gut investiert.
Wie überzeuge ich mein Team, any zu verbannen?
Nicht mit einer Diskussion, sondern mit Zahlen. Schalte noImplicitAny ein und zeige die Anzahl der Fundstellen. Nimm danach die Ränder zuerst, also API Zugriffe und catch Blöcke, und miss den Fortschritt. Wenn die Zahl sichtbar sinkt und die Pipeline grün bleibt, erledigt sich die Grundsatzdebatte von selbst.
Was ist mit einer Type Assertion auf unknown?
Ein wert as Nutzer hinter einem unknown hebt genau die Sicherheit wieder auf, für die du unknown gewählt hast. Du behauptest dann etwas, statt es zu prüfen. Wo eine Assertion unvermeidbar ist, gehört ein Kommentar mit Begründung daneben, damit im nächsten Review erkennbar bleibt, worauf die Annahme beruht.