Skip to content
This repository has been archived by the owner on Dec 21, 2022. It is now read-only.

⬆️ tslint Regelset aktualisieren #19

Open
wants to merge 5 commits into
base: develop
Choose a base branch
from

Conversation

heikomat
Copy link
Contributor

@heikomat heikomat commented Mar 23, 2019

Dieser PR soll die tslint-regeln auf einen aktuellen Stand bringen.

Das dient als Vorarbeit unsere tslint-eslint-regeln aufzuräumen, was dann zum schluss #18 fixen soll.

Änderungen

Fixes #17
Obsoletes #4

Neue Regeln

Typescript specific
  • ban-ts-ignore
    Verbietet das untertrücken von TS-Fehlermeldungen mit // @ts-ignore

  • ban-types
    Verbietet die Verwendung bestimmter typen wie Object, String und Number (Stattdessen sollte man {}, string und number verwenden)

  • no-import-side-effect
    Verbietet das importieren von Modulen nur für ihre Seiteneffekte.
    (z.B. import 'rxjs/add/observable/of') (erlaubt weiterhin das importieren von css)

  • no-non-null-assertion
    Verbietet nicht-null assertion mit dem !-postfix operator. Sein zweck ist es, TypeScript zu sagen, dass etwas nicht null und nicht undefined ist. Beispiel:
    someObject!.someMethod() Hier wird TypeScript gesagt, dass someObject nicht null und nicht undefined ist.

  • no-parameter-reassignment
    Verbietet das neuzuweisen von Parametern

  • no-unnecessary-type-assertion
    Verbietet redundante type assertions, die den Typen der Variable nicht verändern

Functionality
  • ban-comma-operator
    Verbietet den Kommaoperator

  • ban
    Verbietet die Verwendung bestimmter funktionen. Analog zu no-restricted-properties bei eslint.

  • function-constructor
    Verbietet die Verwendung vom Function-konstruktur (new Function()).

  • no-duplicate-super
    Verbietet es, in einem Konstruktor super() mehrfach aufzurufen.

  • no-duplicate-switch-case
    Verbietet es, in einem switch-case-statement den selben case mehrfach zu verwenden.

  • no-dynamic-delete
    Verbietet es, das delete statement mit einem dynamischen Wert zu verwenden (z.b. delete myObject[id]). Es wird empfholen, für solche Fälle eine Map oder ein Set zu verwenden.

  • no-implicit-dependencies
    Verbietet die Verwendung von Dependencies, die nicht in der package.json gelistet sind.

  • no-invalid-template-strings
    Warnt vor der Verwendung von ${ in nicht-template strings.

  • no-null-keyword
    Verbietet die Verwendung von null. Stattdessen sollte undefined verwendet werden. Die Regel existierte vorher schon, war aber bisher abgeschaltet. Siehe Plädoyer gegen null javascript-guidelines#8 für mehr Infos.

  • no-object-literal-type-assertion
    Verbietet Ausdrücke wie const x = { ... } as T;. Stattdessen sollte const x: T = { ... }; verwendet werden.

  • no-return-await
    Verbietet return await an stellen, an denen das await keinen
    Unterschied macht.

  • no-sparse-arrays
    Verbietet es bei Arraydefinitionen mehrere Kommata direkt hintereinander zu haben, da das mit hoher Wahrscheinlichkeit ein typo ist.

  • no-submodule-imports
    Verbietet das importieren aus submodulen (z.b. import {A} from myModule/mySubmodule/mySubSubModule). Ausnahmen für rxjs, @angular und @ionic-native sind hinzugefügt.

  • no-tautology-expression
    Verbietet vergleiche bei denen die linke Seite und die rechte Seite der Selbe Ausdruck oder die selbe Variable sind, z.B. 3 === 3. Diese Vergleiche evaluieren immer zu true, und sind vermutlich ein Fehler.

  • no-unnecessary-class
    Verbietet die Verwendung von Klassen, die keinen State halten. Funktionen von Klassen ohne State können ebenso ohne die Klasse drumherum verwendet werden.

  • prefer-conditional-expression
    Warnt vor der Verwendung einer reinen if-else-expression (ohne else if!), wenn diese nur dazu dient, eine einzige Variable zuzuordnen. In dem Fall (und nur in dem Fall) Wird der Ternäre (?) Operator empfohlen.

  • prefer-object-spread
    Verbietet const myObjectB = Object.assign({}, myObjectA) zu Gunsten von const myObjectB = {...MyObjectA}.

  • static-this
    Verbietet die Verwendung von this in statischen Methoden.

  • unnecessary-constructor
    Verhindert die Verwendung von Konstruktoren, die keinen Inhalt haben (nichtmal einen super-call bei abgeleiteten Klassen), da JavaScript automatisch einen leeren Konstruktor hinzufügt, wenn keiner angegeben ist.

Maintainability
  • no-duplicate-imports
    Verbietet es, mehrere import-statements für das Selbe Modul zu verwenden. Alle Imports aus einem Modul sollten in einem import statement passieren.
Style
  • binary-expression-operand-order
    Erzwingt, dass bei binären Verknüpfungen die variablen vor den konstanten kommen. z.b. wäre x + 1 ok, aber 1 + x nicht.

  • encoding
    Erzwingt UTF8-Encoding

  • increment-decrement
    Verbietet foo++, --foo etc. Stattdessen soll foo += 1 verwendet werden. Diskussionswürdig!

  • interface-name
    Erzwingt, dass die Namen von Interfaces mit einem I anfangen. Die Regel existierte vorher bereits, war aber bisher deaktiviert.

  • newline-per-chained-call
    Erzwingt, dass bei zusammengeketteten Funktionsaufrufen hinter jedem Funktionsaufruf eine newline ist. Das macht den code idr. leserlicher, und diffs einfacher.

  • no-parameter-properties
    Verbietet die Verwendung von parameter properties. Dazu gab es hier eine Diskussion. Es wurde zwar keine Einigung erreicht, aber dennoch beschlossen, dass wir parameter properties nicht verwenden.
    Die Regel war vorher bereits vorhanden, aber bisher deaktiviert.

  • no-reference-import
    Verbietet das angeben einer Triple-Slash Direktive, wenn das referenzierte Modul sowieso auch normal importiert wird.

  • no-unnecessary-callback-wrapper
    Ersetzt x => f(x) mit f. Ich habe diese neue Regel NICHT Aktiviert, da sie broken ist. wenn man die arrow-function drumherum weg lässt, wird f ggf. in einem anderen scope und ggf. mit weniger Parametern ausgeführt. Siehe no-unnecessary-callback-wrapper false positive (mismatched args) palantir/tslint#2430

  • object-literal-shorthand
    Erzwingt die Verwendung oder Nicht-Verwendung von object property shorthands. Die Regel var vorher bereits vorhanden, aber bisher deaktiviert. Jetzt ist sie so eingestellt, dass object property shorthands verboten sind.

  • prefer-template
    Erzwingt die Verwendung von const result = `${myString1}${myString2}`; anstatt const result = myString1 + myString2;.

  • prefer-while
    Erzwingt die Verwendung von while-loops anstatt for-loops ohne initialisierung.

  • space-within-parens
    Erzwingt eine gegebene Anzahl an Leerzeichen innerhalb von runden Klammern. Hier auf 0 gestellt.

  • type-literal-delimiter
    Erzwingt, dass bei einer type-definition die member mit einem Semikolon getrennt sind.

  • unnecessary-else
    Verbietet else-blöcke, die zu if-blöcken gehören, die auf ein break, continue, return oder throw enden. Der Inhalt des else-blocks kann in den fällen unverändert nach dem if-block stehen, und der else-block selbst kann entfernt werden (early-exit)

"prefer-readonly": true,
"match-default-export-name": true,
"return-undefined": true,
"unnecessary-bind": true,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wieso verwenden wir eigentlich keine Regeln, die "type checking" benötigen?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Weil die Verwendung von typechecking extrem langsam ist. So war es zumindest damals.

"ban-ts-ignore": true,
"ban-types": {
"options": [
["Object", "Use {} instead."],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warum {} statt object? (kleines "o")

"parameter",
"arrow-parameter",
"property-declaration",
"variable-declaration",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Das ist vermutlich out-of-scope von diesem PR, aber ich habe mich immer gefragt, wieso wir bei TypeScript den Typ der Variable immer angeben müssen, obwohl der Compiler den Typ per Type Inference bestimmen kann. TypeScript kann das schon seit längerer Zeit (siehe auch https://www.typescriptlang.org/docs/handbook/type-inference.html).

In .NET Projekten erlauben (bzw. erzwingen!) wir, den Typ der Variable wegzulassen, wenn der Compiler den Typ durch die Angabe auf der rechten Seite selbstständig ermitteln kann. Warum also nicht in TypeScript Projekten?

(Eventuell sollte man aus diesem Kommentar ein Issue machen. Da gibt es sicherlich Diskussionsbedarf.)

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

TSLint rule "typeof-compare" is deprecated
4 participants