Heim Web-Frontend js-Tutorial Die TypeScript-Intervention: Durchbrechen Sie Ihre Sucht nach Laufzeitprüfungen mit Byzantium

Die TypeScript-Intervention: Durchbrechen Sie Ihre Sucht nach Laufzeitprüfungen mit Byzantium

Oct 27, 2024 am 06:15 AM

Schauen Sie, wir müssen über Ihre Sucht nach Typprüfung sprechen. Ja, Sie – derjenige mit 47 Instanzen von Prüfungen in Ihrer Authentifizierungs-Middleware. Der Entwickler, der mehr Testfälle als tatsächlichen Code schreibt. Derjenige, der TypeScript so behandelt, als wären es nur ausgefallene JSDoc-Kommentare.

Die Intervention

Lass mich dir ein Bild malen: Es ist Mittag, du trinkst deine vierte Tasse Kaffee und behebst ein Produktionsproblem. Die Protokolle zeigen, dass ein Benutzer Ihre fünfzehn Ebenen der Laufzeitvalidierung irgendwie überwunden hat. Sie haben mehr Unit-Tests, als Twitter aktive Benutzer hat, aber irgendwie, irgendwie, ist es jemandem gelungen, eine Zahl an die Stelle zu senden, an der sich eine Zeichenfolge befinden sollte.

„Aber das ist unmöglich!“ Sie weinen und scrollen durch Ihren Testabdeckungsbericht, der makellose 100 % zeigt. „Das habe ich überprüft!“

Hast du das aber? Hast du wirklich? Oder haben Sie einfach dreimal denselben Scheck ausgestellt:

  1. Einmal in TypeScript-Schnittstellen
  2. Wieder in Ihrer Validierungs-Middleware
  3. Und noch einmal in Ihren Unit-Tests

Hören Sie auf zu testen, was TypeScript bereits weiß

Hier ist eine revolutionäre Idee: Was wäre, wenn wir einfach... dem Compiler vertrauen würden? Ich weiß, wildes Konzept. Aber hör mir zu.

interface ValidRabbit {
    username: string;
    password: string;
}
interface InvalidRabbit {
    username: number;
    password: string;
}


type ValidateRabbit<Rabbit> = Assert<
    //assert that Rabbit is of type {username, password}
    Is.Type<
        User,
        {
            username: string;
            password: string;
        }
    >,
    //custom compile time exceptions
    "Trix are for kids. Provide a username and password.",
    User
>;

// Ha! Silly Rabbit...
function checkRabbit<T>(rabbit: ValidateRabbit<T>) {
    // .... protect your trix
}

declare const rabbit1: ValidRabbit;
declare const rabbit2: InvalidRabbit;

checkRabbit(rabbit1);
checkRabbit(rabbit2);
/**        ~~~~~~~~~
 *           └───── Type Exception! "...Provide a username and password"
 */
Nach dem Login kopieren
Nach dem Login kopieren

„Aber was ist mit der Produktion?“

Ich kann Sie jetzt hören: „Aber was ist, wenn jemand ungültiges JSON an meine API sendet?“

Zuallererst: Wer hat dir wehgetan? Zweitens: Ja, validieren Sie Ihre API-Grenzen. Aber sobald diese Daten in Ihre TypeScript-Domäne gelangen, ist es Zeit loszulassen. Lassen Sie den Compiler Ihr Türsteher sein.

Das bringt Byzanz zu Ihrer Treuhandparty:

// Define your trust boundaries
type APIRequest<Request> = Assert<
    And<
    Is.On<Request, "body">,
    Or<Is.In<Request["method"], "POST">, Is.In<Request["method"], "PUT">>
>;,
    "Someone's being naughty with our API"
>;

// Now everything inside is type-safe
function handleRequest<R>(req: APIRequest<R>) {
    // If it compiles, it's valid
    // If it's valid, it compiles
    // This is the way
}
Nach dem Login kopieren

Das DevOps-Team wird Sie (ausnahmsweise) lieben

Stellen Sie sich Folgendes vor: Ihre CI/CD-Pipeline ist in Minuten statt in Stunden fertig. Ihre Produktionsprotokolle sind nicht mit Typfehlern gefüllt. Ihre AWS-Rechnung sieht nicht wie eine Telefonnummer aus.

Wie? Weil Byzantium Ihre Typprüfung in die Kompilierungszeit verlagert. Nicht mehr:

  • Tausende von Unit-Tests ausführen, die nur Typen überprüfen
  • Es werden CPU-Zyklen verbraucht, wobei immer wieder dieselben Typen überprüft werden
  • Um 3 Uhr morgens aufgewacht, weil jemand undefiniert an eine Funktion übergeben hat, die eindeutig angab, dass sie einen String benötigt
// Before: Your CPU crying for help
function validateUserMiddleware(req, res, next) {
    try {
        validateId(req.params.id)        // CPU cycle
        validateBody(req.body)           // CPU cycle
        validatePermissions(req.user)    // CPU cycle
        validateToken(req.headers.auth)  // CPU cycle
        // Your CPU is now considering a career change
        next()
    } catch (e) {
        res.status(400).json({ error: e.message })
    }
}

// After: Your CPU sending you a thank you note
type ValidRequest = Assert<
    And<
        Is.On<Request, 'params.id'>,
        Is.On<Request, 'body'>,
        Is.On<Request, 'user'>,
        Is.On<Request, 'headers.auth'>
    >,
    "Invalid request shape"
>;

function handleRequest(req: ValidRequest) {
    // Just business logic, no trust issues
}
Nach dem Login kopieren

„Aber ich liebe es, Tests zu schreiben!“

The TypeScript Intervention: Breaking Your Runtime Check Addiction with Byzantium
Großartig! Schreiben Sie Tests für Dinge, die tatsächlich getestet werden müssen:

  • Geschäftslogik
  • Integrationspunkte
  • Benutzerworkflows
  • Komplexe Algorithmen

Wissen Sie, was nicht getestet werden muss? Ob ein String tatsächlich ein String ist. Lassen Sie TypeScript diese existenzielle Krise bewältigen.

Real Talk: Die Vorteile

  1. Schnellere Entwicklung

    • Kein Schreiben derselben Validierung mehr auf drei verschiedene Arten
    • Fehler zur Kompilierungszeit abfangen, nicht um 3 Uhr morgens
    • Verbringen Sie Zeit mit Funktionen, nicht mit Validierungs-Boilerplate
  2. Bessere Leistung

    • Kein Laufzeitaufwand für die Typprüfung
    • Kleinere Bundle-Größen (keine Validierungsbibliotheken)
    • Glückliche CPUs, glückliches Leben
  3. Verbesserte Sicherheit

    • Garantien auf Typebene können nicht umgangen werden
    • Kein „Ups, ich habe vergessen, das zu bestätigen“ mehr
    • Vollständige Abdeckung standardmäßig
  4. DevOps-Träume

    • Schnellere CI/CD-Pipelines
    • Geringere Infrastrukturkosten
    • Weniger Produktionsvorfälle
    • Zufriedeneres SRE-Team (Ergebnisse können variieren)

Erste Schritte

interface ValidRabbit {
    username: string;
    password: string;
}
interface InvalidRabbit {
    username: number;
    password: string;
}


type ValidateRabbit<Rabbit> = Assert<
    //assert that Rabbit is of type {username, password}
    Is.Type<
        User,
        {
            username: string;
            password: string;
        }
    >,
    //custom compile time exceptions
    "Trix are for kids. Provide a username and password.",
    User
>;

// Ha! Silly Rabbit...
function checkRabbit<T>(rabbit: ValidateRabbit<T>) {
    // .... protect your trix
}

declare const rabbit1: ValidRabbit;
declare const rabbit2: InvalidRabbit;

checkRabbit(rabbit1);
checkRabbit(rabbit2);
/**        ~~~~~~~~~
 *           └───── Type Exception! "...Provide a username and password"
 */
Nach dem Login kopieren
Nach dem Login kopieren

Die Wahl liegt bei Ihnen

Sie können weiterhin in Angst leben, Laufzeitprüfungen für alles schreiben und TypeScript wie optionale Eingabe für JavaScript behandeln.

Oder Sie kommen 2024 zu uns, wo wir unserem Compiler vertrauen und ihn seine Arbeit machen lassen.

Denken Sie daran: Jedes Mal, wenn Sie eine Laufzeit-Typprüfung schreiben, schreit irgendwo ein TypeScript-Compiler.

Abschluss

Byzantium ist nicht nur eine weitere Bibliothek – es ist eine Lösung für Ihre Vertrauensprobleme mit Typen. Es ist an der Zeit, die Laufzeitprüfungen hinter sich zu lassen und die Leistungsfähigkeit von Garantien zur Kompilierungszeit zu nutzen.

Ihre CPU wird es Ihnen danken. Ihr DevOps-Team wird es Ihnen danken. Ihre Benutzer werden es Ihnen danken (indem sie keine typbezogenen Fehler finden).

Und das Wichtigste: Sie werden sich um 3 Uhr morgens bedanken, wenn Sie tief und fest schlafen, anstatt Tippfehler in der Produktion zu debuggen.


P.S. Wenn Sie immer noch nicht überzeugt sind, versuchen Sie zu zählen, wie viele Laufzeittypprüfungen Sie in Ihrer Codebasis haben. Dann multiplizieren Sie das mit Ihrem Stundensatz. So viel Zeit verbringen Sie damit, TypeScript nicht zu vertrauen.

P.P.S. Bei der Erstellung dieses Blogbeitrags wurden keine Personen geschädigt. Allerdings wurden mehrere Laufzeitprüfungen endgültig eingestellt.

*P.P.P.S. Wenn Sie einen Beitrag leisten möchten, schauen Sie auf meinem Github vorbei und klonen Sie das Repo. Alles ist noch frisch, also viele Möglichkeiten, etwas beizutragen.

Dokumente und Paket verfügbar auf JSR.io

Das obige ist der detaillierte Inhalt vonDie TypeScript-Intervention: Durchbrechen Sie Ihre Sucht nach Laufzeitprüfungen mit Byzantium. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1672
14
PHP-Tutorial
1277
29
C#-Tutorial
1257
24
Python vs. JavaScript: Die Lernkurve und Benutzerfreundlichkeit Python vs. JavaScript: Die Lernkurve und Benutzerfreundlichkeit Apr 16, 2025 am 12:12 AM

Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

JavaScript und das Web: Kernfunktionalität und Anwendungsfälle JavaScript und das Web: Kernfunktionalität und Anwendungsfälle Apr 18, 2025 am 12:19 AM

Zu den Hauptanwendungen von JavaScript in der Webentwicklung gehören die Interaktion der Clients, die Formüberprüfung und die asynchrone Kommunikation. 1) Dynamisches Inhaltsaktualisierung und Benutzerinteraktion durch DOM -Operationen; 2) Die Kundenüberprüfung erfolgt vor dem Einreichung von Daten, um die Benutzererfahrung zu verbessern. 3) Die Aktualisierung der Kommunikation mit dem Server wird durch AJAX -Technologie erreicht.

JavaScript in Aktion: Beispiele und Projekte in realer Welt JavaScript in Aktion: Beispiele und Projekte in realer Welt Apr 19, 2025 am 12:13 AM

Die Anwendung von JavaScript in der realen Welt umfasst Front-End- und Back-End-Entwicklung. 1) Zeigen Sie Front-End-Anwendungen an, indem Sie eine TODO-Listanwendung erstellen, die DOM-Operationen und Ereignisverarbeitung umfasst. 2) Erstellen Sie RESTFUFFUPI über Node.js und express, um Back-End-Anwendungen zu demonstrieren.

Verständnis der JavaScript -Engine: Implementierungsdetails Verständnis der JavaScript -Engine: Implementierungsdetails Apr 17, 2025 am 12:05 AM

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

Python gegen JavaScript: Community, Bibliotheken und Ressourcen Python gegen JavaScript: Community, Bibliotheken und Ressourcen Apr 15, 2025 am 12:16 AM

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

Python vs. JavaScript: Entwicklungsumgebungen und Tools Python vs. JavaScript: Entwicklungsumgebungen und Tools Apr 26, 2025 am 12:09 AM

Sowohl Python als auch JavaScripts Entscheidungen in Entwicklungsumgebungen sind wichtig. 1) Die Entwicklungsumgebung von Python umfasst Pycharm, Jupyternotebook und Anaconda, die für Datenwissenschaft und schnelles Prototyping geeignet sind. 2) Die Entwicklungsumgebung von JavaScript umfasst Node.JS, VSCODE und WebPack, die für die Entwicklung von Front-End- und Back-End-Entwicklung geeignet sind. Durch die Auswahl der richtigen Tools nach den Projektbedürfnissen kann die Entwicklung der Entwicklung und die Erfolgsquote der Projekte verbessert werden.

Die Rolle von C/C bei JavaScript -Dolmetschern und Compilern Die Rolle von C/C bei JavaScript -Dolmetschern und Compilern Apr 20, 2025 am 12:01 AM

C und C spielen eine wichtige Rolle in der JavaScript -Engine, die hauptsächlich zur Implementierung von Dolmetschern und JIT -Compilern verwendet wird. 1) C wird verwendet, um JavaScript -Quellcode zu analysieren und einen abstrakten Syntaxbaum zu generieren. 2) C ist für die Generierung und Ausführung von Bytecode verantwortlich. 3) C implementiert den JIT-Compiler, optimiert und kompiliert Hot-Spot-Code zur Laufzeit und verbessert die Ausführungseffizienz von JavaScript erheblich.

Von Websites zu Apps: Die verschiedenen Anwendungen von JavaScript Von Websites zu Apps: Die verschiedenen Anwendungen von JavaScript Apr 22, 2025 am 12:02 AM

JavaScript wird in Websites, mobilen Anwendungen, Desktop-Anwendungen und serverseitigen Programmierungen häufig verwendet. 1) In der Website -Entwicklung betreibt JavaScript DOM zusammen mit HTML und CSS, um dynamische Effekte zu erzielen und Frameworks wie JQuery und React zu unterstützen. 2) Durch reaktnatives und ionisches JavaScript wird ein plattformübergreifendes mobile Anwendungen entwickelt. 3) Mit dem Elektronenframework können JavaScript Desktop -Anwendungen erstellen. 4) Node.js ermöglicht es JavaScript, auf der Serverseite auszuführen und unterstützt hohe gleichzeitige Anforderungen.

See all articles