Wie hat mich Typescript enttÀuscht und ist es das wert?



Bevor ich anfange, möchte ich erwĂ€hnen, dass ich ein TypeScript-Fan bin. Dies ist meine Hauptprogrammiersprache fĂŒr Front-End-Projekte in React und fĂŒr alle Back-End-Arbeiten, die ich in Node mache. Ich bin komplett fĂŒr Typescript, aber es gibt Momente, die mich stören und ĂŒber die ich diesen Artikel erzĂ€hlen wollte.

Ich habe in den letzten drei Jahren fĂŒr viele verschiedene Unternehmen ausschließlich ĂŒber TypeScript geschrieben. Meiner Meinung nach macht TypeScript also zumindest etwas richtig oder schließt bestimmte Anforderungen.

Trotz seiner UnzulÀnglichkeiten ist TypeScript in das Mainstream-Entwicklungs-Frontend eingestiegen und belegt laut dem HackerRank-Kompetenzbericht den siebten Platz in der Liste der beliebtesten Programmiersprachen.

Jedes Entwicklerteam, egal ob groß oder klein, das in TypeScript schreibt oder nicht, ist aus SicherheitsgrĂŒnden immer die MĂŒhe wert:

  • Stellen Sie sicher, dass gut geschriebene Komponententests so viel Code wie möglich in der Produktion abdecken.
  • Verwenden Sie die Paarprogrammierung: Ein zusĂ€tzliches Paar Augen hilft dabei, schwerwiegendere Dinge als nur Syntaxfehler zu erkennen
  • Erstellen Sie qualitativ einen CodeĂŒberprĂŒfungsprozess und identifizieren Sie Fehler, die der Computer nicht finden kann
  • Verwenden Sie Linter - wie zB Eslint

Obwohl TypeScript zusĂ€tzlich eine zusĂ€tzliche Sicherheitsstufe hinzufĂŒgt, liegt es meiner Meinung nach in dieser Hinsicht weit hinter anderen Sprachen zurĂŒck. Ich werde erklĂ€ren warum.

TypeScript ist kein zuverlÀssiges Typsystem


Ich denke, dies ist möglicherweise das Hauptproblem bei TypeScript, aber lassen Sie mich zunÀchst herausfinden, was zuverlÀssige und unzuverlÀssige Typsysteme sind .

Robustes Typensystem


Ein zuverlĂ€ssiges Typensystem stellt sicher, dass Ihr Programm nicht in ungĂŒltige ZustĂ€nde gerĂ€t. Wenn der statische Typ eines Ausdrucks beispielsweise eine Zeichenfolge ist und zur Laufzeit ausgewertet wird, erhalten Sie garantiert nur eine Zeichenfolge .

In einem zuverlĂ€ssigen Typsystem werden Sie weder zur Kompilierungszeit noch zur Laufzeit in einer Situation sein, in der der Ausdruck nicht mit dem erwarteten Typ ĂŒbereinstimmt.

NatĂŒrlich gibt es verschiedene Grade an ZuverlĂ€ssigkeit sowie verschiedene Interpretationen von ZuverlĂ€ssigkeit. TypeScript ist einigermaßen zuverlĂ€ssig und fĂ€ngt Tippfehler ab:

// Type 'string' is not assignable to type 'number' const increment = (i: number): number => { return i + "1"; } // Argument of type '"98765432"' is not assignable to parameter of type 'number'. const countdown: number = increment("98765432"); 

Unsicheres Typensystem


Maschinenschrift meldet absolut offen, dass 100% ige ZuverlÀssigkeit nicht sein Zweck ist. Sogar die "Nicht-Ziel" -Nummer 3 in der TypeScript -Liste "Nicht-Ziel" besagt eindeutig:
Ein zuverlĂ€ssiges oder „nachweislich korrektes“ Typensystem zu haben, ist nicht unser Ziel. Stattdessen bemĂŒhen wir uns um ein Gleichgewicht zwischen Genauigkeit und Leistung.

Dies bedeutet, dass es keine Garantie dafĂŒr gibt, dass die Variable zur Laufzeit von einem bestimmten Typ ist. Ich kann dies anhand des folgenden, etwas erfundenen Beispiels veranschaulichen:

 interface A { x: number; } let a: A = {x: 3} let b: {x: number | string} = a; bx = "unsound"; let x: number = ax; // unsound axtoFixed(0); // WTF is it? 

Der obige Code funktioniert nicht, da bekannt ist, dass ax eine Zahl aus der Schnittstelle A ist. Leider verwandelt es sich nach ein paar Finten mit Neuzuweisung in einen String und dieser Code wird kompiliert, jedoch mit Fehlern zur Laufzeit.

Leider kompiliert dieser Ausdruck ohne Fehler:

 axtoFixed(0); 

Dass ZuverlĂ€ssigkeit nicht das Ziel der Sprache ist, ist wahrscheinlich eines der grĂ¶ĂŸten Probleme von TypeScript. Ich bekomme zur Laufzeit immer wieder viele Laufzeitfehler, die der tsc- Compiler nicht abfĂ€ngt , aber die der Compiler bemerkt hĂ€tte, wenn ein zuverlĂ€ssiges Typsystem in TypeScript existiert hĂ€tte. TypeScript ist jetzt ein Fuß im Lager der "zuverlĂ€ssigen" Sprachen und der andere Fuß im Lager der "unzuverlĂ€ssigen". Dieser Ansatz mit halben Maßen basiert auf jedem Typ, den ich spĂ€ter erörtern werde.

Ich bin frustriert darĂŒber, dass die Anzahl der Tests, die ich schreibe, mit dem Übergang zu TypeScript nicht abgenommen hat. Als ich gerade anfing, entschied ich fĂ€lschlicherweise, dass ich die lĂ€stige Routine reduzieren könnte, eine große Anzahl von Unit-Tests zu schreiben.

TypeScript stellt den aktuellen Stand der Dinge in Frage, indem es argumentiert, dass die Senkung der kognitiven Kosten bei der Verwendung von Typen wichtiger ist als die ZuverlÀssigkeit.

Ich verstehe, warum TypesScript einen solchen Pfad gewÀhlt hat und es gibt eine Meinung, dass TypeScript nicht so beliebt wÀre, wenn die ZuverlÀssigkeit des Typsystems zu 100% garantiert wÀre. Diese Meinung hat sich nicht bewÀhrt - die Dart-Sprache gewinnt zusam- men mit der weit verbreiteten Verwendung von Flutter rasch an Beliebtheit. Und es wird argumentiert, dass TypzuverlÀssigkeit das Ziel von Dart ist.

Die Unsicherheit und die verschiedenen Möglichkeiten, die TypeScript bietet, machen es weniger effizient und im Moment leider nur "besser als nichts" . Ich wĂŒrde mich freuen, wenn mit zunehmender Beliebtheit von TypeScript mehr Compiler-Optionen verfĂŒgbar werden und erfahrene Benutzer nach 100% iger ZuverlĂ€ssigkeit streben können.

TypeScript garantiert keine TypprĂŒfung zur Laufzeit


Die TypprĂŒfung zur Laufzeit ist nicht der Zweck von TypeScript, daher wird mein Wunsch wahrscheinlich niemals in ErfĂŒllung gehen. Die LaufzeitĂŒberprĂŒfung ist beispielsweise hilfreich, wenn Sie mit JSON-Daten arbeiten, die von API-Aufrufen zurĂŒckgegeben wurden. Es wĂ€re möglich, eine ganze Kategorie von Fehlern und viele Komponententests loszuwerden, wenn wir diese Prozesse auf der Ebene des Typsystems steuern könnten.

Da wir zur Laufzeit nichts garantieren können, kann dies leicht passieren:

 const getFullName = async (): string => { const person: AxiosResponse = await api(); //response.name.fullName may result in undefined at runtime return response.name.fullName } 

Es gibt einige Hilfsbibliotheken wie io-ts , was großartig ist, aber das kann bedeuten, dass Sie Ihre Modelle duplizieren mĂŒssen.

Furchterregende Art irgendeine und strenge Wahl


Der Typ any bedeutet "any", und der Compiler ermöglicht die Operation oder Zuweisung einer Variablen dieses Typs.

TypeScript funktioniert gut fĂŒr kleine Dinge, aber die Leute neigen dazu, den Typ auf etwas zu setzen, das lĂ€nger als eine Minute dauert. Ich habe kĂŒrzlich an einem Angular-Projekt gearbeitet und eine Menge Code wie diesen gesehen:

 export class Person { public _id: any; public name: any; public icon: any; 

Mit TypeScript können Sie das Typsystem vergessen.

Sie können die Art von allem mit jedem brechen:

 ("oh my goodness" as any).ToFixed(1); // remember what I said about soundness? 

Die Option strict enthÀlt die folgenden Compiler-Optionen, die alles zuverlÀssiger machen:

  • --strictNullChecks
  • --noImplicitAny
  • --keinimpliziertesDies
  • - immerStrict

Es gibt auch eine Regel fĂŒr eslint @ typescript -eslint / no-explicit-any .

Das Verteilen von Code kann die ZuverlÀssigkeit Ihres Codes beeintrÀchtigen.

Fazit


Ich muss wiederholen, dass ich ein TypeScript-Fan bin und es in meiner tĂ€glichen Arbeit verwende, aber ich habe das GefĂŒhl, dass es unvollkommen ist und der Rummel darum nicht ganz gerechtfertigt ist. Airbnb behauptet, TypeScript habe dazu beigetragen, 38% der Fehler zu vermeiden . Ich bin sehr skeptisch in Bezug auf den so genau angegebenen Prozentsatz. TypeScript verbessert oder kombiniert nicht alle vorhandenen Methoden fĂŒr guten Code. Ich muss noch eine Menge Tests schreiben. Man könnte argumentieren, dass ich mehr Code schreibe, also muss ich so viele Tests schreiben. Ich bekomme immer wieder unerwartete Laufzeitfehler.

TypeScript bietet nur eine grundlegende TypprĂŒfung, und die Tatsache, dass ZuverlĂ€ssigkeit und TypprĂŒfung zur Laufzeit nicht ihre Aufgabe sind, lĂ€sst TypeScript in der Welt der halben Sachen zwischen der besten Welt und der Welt, in der wir jetzt programmieren, zurĂŒck.

TypeScript ist großartig dank der guten UnterstĂŒtzung von IDEs wie vscode, bei denen wir wĂ€hrend des Druckvorgangs visuelles Feedback erhalten.


TypeScript-Fehler in vscode

TypeScript verbessert auch Refactoring- und Code-Breaking-Änderungen (z. B. Änderungen an Methodensignaturen), die beim Start des TypeScript-Compilers sofort erkannt werden.
TypeScript bietet eine gute TypprĂŒfung und ist definitiv besser als keine TypprĂŒfung oder einfache Eslint-PrĂŒfung, aber ich bin der Meinung, dass TypeScript viel besser sein kann und die erforderlichen Compiler-Optionen diejenigen zufrieden stellen können, die mehr von der Sprache wollen.



Abonnieren Sie unseren Instagram-Entwickler


Source: https://habr.com/ru/post/de485206/


All Articles