


Die TypeScript-Intervention: Durchbrechen Sie Ihre Sucht nach Laufzeitprüfungen mit Byzantium
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:
- Einmal in TypeScript-Schnittstellen
- Wieder in Ihrer Validierungs-Middleware
- 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" */
„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 }
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 }
„Aber ich liebe es, Tests zu schreiben!“
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
-
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
-
Bessere Leistung
- Kein Laufzeitaufwand für die Typprüfung
- Kleinere Bundle-Größen (keine Validierungsbibliotheken)
- Glückliche CPUs, glückliches Leben
-
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
-
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" */
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

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

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











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.

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.

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.

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

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.

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.

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.
