-
Notifications
You must be signed in to change notification settings - Fork 2
⬆️ tslint Regelset aktualisieren #19
base: develop
Are you sure you want to change the base?
Conversation
"prefer-readonly": true, | ||
"match-default-export-name": true, | ||
"return-undefined": true, | ||
"unnecessary-bind": true, |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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."], |
There was a problem hiding this comment.
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", |
There was a problem hiding this comment.
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.)
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
null
)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
undNumber
(Stattdessen sollte man{}
,string
undnumber
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 eineMap
oder einSet
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 sollteundefined
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 sollteconst x: T = { ... };
verwendet werden.no-return-await
Verbietet
return await
an stellen, an denen dasawait
keinenUnterschied 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ürrxjs
,@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 zutrue
, 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 vonconst 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, aber1 + x
nicht.encoding
Erzwingt UTF8-Encoding
increment-decrement
Verbietet
foo++
,--foo
etc. Stattdessen sollfoo += 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)
mitf
. Ich habe diese neue Regel NICHT Aktiviert, da sie broken ist. wenn man die arrow-function drumherum weg lässt, wirdf
ggf. in einem anderen scope und ggf. mit weniger Parametern ausgeführt. Sieheno-unnecessary-callback-wrapper
false positive (mismatched args) palantir/tslint#2430object-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}`;
anstattconst result = myString1 + myString2;
.prefer-while
Erzwingt die Verwendung von
while
-loops anstattfor
-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
oderthrow
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)