Warum wird meine React Native-App trotz TypeScript-Compilerfehler erfolgreich erstellt?

15

Ich habe vor kurzem begonnen, TypeScript mit Expo zu verwenden. Ich habe alle Linter / Formatierer-Integrationen typescript-eslintso durchgeführt, dass ich die meisten Fehler beim Codieren abfangen kann. Um zu überprüfen, ob der Code kompiliert wird, führe ich ab npx tscund zu aus und korrigiere entsprechend.

Eine Sache, die ich noch nicht vollständig verstanden habe, ist, warum meine App auch bei zahlreichen Kompilierungsfehlern erfolgreich erstellt wird. Ich erwarte (und bevorzuge), dass für jeden Kompilierungsfehler ein roter Bildschirmfehler angezeigt wird, anstatt dass die App erfolgreich erstellt wurde, und ich finde es später heraus. Zum Beispiel,

function square<T>(x: T): T {
  console.log(x.length); // error TS2339: Property 'length' does not exist on type 'T'.
  return x * x;
}

ist ein typischer TypeScript-Fehler, der (glaube ich?) beim Kompilieren leicht überprüft werden kann. Ich möchte, dass es zu einem großen roten Bildschirmfehler kommt und der Build fehlschlägt.

Ich bin ziemlich neu in TypeScript, daher fehlt mir möglicherweise etwas sehr Wichtiges. Was genau verursacht diese Nachsicht und gibt es eine Möglichkeit, strengere Kontrollen durchzusetzen?

anar
quelle
Mit "Builds erfolgreich" meinen Sie, dass der JS trotzdem ausgegeben wird oder irgendwann keine Compiler-Fehlermeldung mehr angezeigt wird?
ecraig12345
2
Ich meine, der JS wird sowieso ausgegeben und ich kann die App im Entwicklungsmodus ausführen und sogar die Produktions-App ohne Probleme erstellen. Ich hätte erwartet, dass TypeScript dies beim Kompilieren verhindert. Compiler-Fehlermeldungen werden immer angezeigt, wenn ich sie ausführe, npx tscaber ich möchte für jeden TypeScript-Fehler einen roten Bildschirm erhalten, genau wie für normale JS-Fehler. const n = 23; n.reverse();Dies führt zu einem roten Bildschirm mit der Meldung "n.reverse ist keine Funktion. (In 'n.reverse ()', 'n.reverse' ist undefiniert) "
anar
2
Ich finde das auch so komisch. Ich kann auch keine adäquate Lösung dafür finden.
Simon Bengtsson

Antworten:

2

Das erste, was zu verstehen ist, ist, dass Typescript eine Obermenge von Javascript ist und in diesem Fall beim Kompilieren nicht typgeprüft wird.

Im Wesentlichen entfernt Babel nur das Typoskript und konvertiert es in Javascript, das dann in die js-Bundles kompiliert wird.

Sie können sich die erste Zeile der folgenden Babel-Dokumente sowie die Vorbehalte ansehen: https://babeljs.io/docs/en/next/babel-plugin-transform-typescript

Da Babel keine Typprüfung durchführt, wird Code, der syntaktisch korrekt ist, aber fehlschlagen würde, möglicherweise erfolgreich transformiert, und zwar häufig auf unerwartete oder ungültige Weise.

Was ich vorschlagen würde, ist die Erweiterung Ihres Build-Befehls, um zuerst die tscTypescript-Kompilierung noEmiteinzuschließen oder vielmehr, und in Ihrer tsconfig auf true zu setzen.

Update : Ich habe eine andere Instanz gefunden, in der dies kürzlich beim Hinzufügen jestund typescriptzu einem Projekt zutrifft . Am Ende der Jest-Dokumente steht tatsächlich dasselbe:

https://jestjs.io/docs/en/getting-started#using-typescript

Es gibt jedoch einige Einschränkungen bei der Verwendung von TypeScript mit Babel. Da die TypeScript-Unterstützung in Babel Transpilation ist, überprüft Jest Ihre Tests nicht, während sie ausgeführt werden. Wenn Sie das wollen, können Sie ts-jest verwenden.

Mark Atkinson
quelle