
TypeScript の tsconfig.json が とりあえずできました. 次は静的解析ツールの TSLint を 設定する tslint.json の 設定内容について検討します.
作業環境
- Windows 10 64bit
- Node.js 8.4.0 64bit
- TypeScript 2.4
- TSLint 5.6.0
TSLint とは?
TSLint は プログラムを動作させずに解析し問題になりそうなコードや規約違反などをチェックする TypeScript 向けの静的解析ツールです. JavaScript では ESLint、Java では SpotBugs(FindBugs) & Checkstyle などが同種のツールにあたります.
設定項目の確認
TSLint core rules を 確認し、ざっと理解のためのメモを作りました.
英語ができないのと、TypeScript/TSLint に 詳しくない状態で書いているので、間違えや勘違いがあるかもしれないでご注意ください…
英文のままになっているところは、よくわからなかった and/or 日本語で表現できなかった ので、とりあえず そのまま転記しました. いつの日かアップデートできるように頑張りたい.
TypeScript-specific
| ルール | 概要 |
|---|---|
| adjacent-overload-signatures | 関数のオーバーロードは連続して記述し、可読性を向上させる |
| ban-types | 特定の型を使用禁止にする |
| member-access | クラス・メンバーの可視性宣言を強制させる |
| member-ordering | クラス・メンバーの順序付けを強制し、可読性を向上させる |
| no-any | any の 型宣言を使用禁止にする
|
| no-empty-interface | 空のインターフェースを禁止する |
| no-import-side-effect | 副作用を伴う import を 禁止する
|
| no-inferrable-types | number string boolean の 初期化済みの型宣言を禁止し冗長なコードを排除させる
|
| no-internal-module | 内部 module を 禁止し、新しい namespace キーワードの利用を使用させる
|
| no-magic-numbers | マジックナンバーを禁止する (ただしデフォルトでは -1 0 1 は 許可)
|
| no-namespace | 内部 module とnamespace を 禁止し、 ES6-style の import/export を使用させる
|
| no-non-null-assertion | non-null アサーションを禁止し、strict null checking mode を 活用させる |
| no-reference | /// <reference path=> を 禁止し、ES6-style の import/export を使用させる
|
| no-unnecessary-type-assertion | 型アサーションが、式の型を変更しない場合に警告する |
| no-var-requires | import 以外の require を 禁止し、ES6-style の import/export を使用させる
|
| only-arrow-functions | Arrow-style 以外の function 関数式を禁止し、予期しない this アクセスを防止する
|
| prefer-for-of | 配列のインデックスにアクセスしないループの場合は、 for-of を 使用させる
|
| promise-function-async | Promise を 返す関数またはメソッドは async の マークを必須とする
|
| typedef | 型定義を必須とする |
| typedef-whitespace | 型指定子(コロン) の 前後のスペース有無をチェックします |
| unified-signatures | union または optional/rest で1つに統合できるオーバーロードを警告する
|
Functionality
| ルール | 概要 |
|---|---|
| await-promise | Promise ではない awaited な 値を警告する
|
| ban | 特定の関数やグローバル・メソッドを禁止する |
| curly | if/for/do/while で 中括弧を必須とする
|
| forin | for-in の if フィルターを必須とし、継承プロパティへの偶発アクセスを防止する
|
| import-blacklist | 直接 import require せず、サブモジュール・ロードにして不要なロードを避ける
|
| label-position | ラベルの使用を do/for/while/switch に限定し、コードの構造化を強化する
|
| no-arg | arguments.callee を 禁止し、パフォーマンスの最適化を行えるようにする
|
| no-bitwise | ビット演算子を禁止し、保守性を向上させる |
| no-conditional-assignment | do-while/for/if/while での条件文における代入を禁止する
|
| no-console | 指定するコンソール・メソッド (e.g. log error) の 仕様を禁止する
|
| no-construct | String Number Boolean の コンストラクタ利用を禁止し、関数を利用させる
|
| no-debugger | debugger ステートメントを禁止する
|
| no-duplicate-super | コンストラクタでの super() 二重呼び出しを警告する
|
| no-duplicate-variable | 同一スコープでの var 重複宣言を禁止する
|
| no-empty | 空ブロックを禁止する |
| no-eval | eval を 禁止し、危険なコードを防止させる
|
| no-floating-promises | 関数から返された Promise の ハンドルを厳格にさせる
|
| no-for-in-array | 配列の for-in ループを禁止し for-of を 利用させる
|
| no-inferred-empty-object-type | 関数とコンストラクタの呼出し側で、 {} (空オブジェクト型)による型推論を禁止する
|
| no-invalid-template-strings | テンプレート文字列以外 の ${ を 警告する
|
| no-invalid-this | クラス外での this キーワードの使用を禁止する
|
| no-misused-new | Warns on apparent attempts to define constructors for interfaces or new for classes.
|
| no-null-keyword | null の 使用を禁止し、 undefined に 統一させる
|
| no-object-literal-type-assertion | インターフェースや |
| no-shadowed-variable | 変数のシャドーイングを禁止する |
| no-sparse-arrays | 配列リテラルの欠落要素(重複カンマ)を禁止しする |
| no-string-literal | 不要な文字列リテラルのプロパティアクセスを禁止し obj.property 書式を使用させる
|
| no-string-throw | プレーン・テキストの throw を 禁止し、 Error の スローを使用させる
|
| no-submodule-imports | サブモジュールのインポートを禁止し、最上位パッケージのエクスポートを使用させる |
| no-switch-case-fall-through | switch の ケース・フォールスルーをきん資する
|
| no-this-assignment | 不要な this 参照を禁止し、Arrow-style ラムダを使用させる
|
| no-unbound-method | メソッドがメソッド呼び出しの外で使用されることを警告する |
| no-unsafe-any | 動的な方法の any 型 利用を警告する
|
| no-unsafe-finally | finally ブロックでの return continue break throws の 使用を禁止する
|
| no-unused-expression | 未使用の式ステートメントを禁止する |
| no-unused-variable | 未使用 の インポート、変数、関数、プライベート・クラスのメンバー を 禁止する |
| no-use-before-declare | 変数の宣言前利用を禁止する |
| no-var-keyword | var を 禁止し、 let と const を 使用させる
|
| no-void-expression | Requires expressions of type void to appear in statement position.
|
| prefer-conditional-expression | Recommends to use a conditional expression instead of assigning to the same thing in each branch of an if statement. |
| prefer-object-spread | Enforces the use of the ES2015 object spread operator over Object.assign() where appropriate.
|
| radix | parseInt を 使う場合に、 radix パラメータの指定を必須とする
|
| restrict-plus-operands | 変数の加算は双方の型が同じ(number + string は禁止) であることを強制する
|
| strict-boolean-expressions | ブール式で許可する型を制限する (デフォルトは boolean のみ)
|
| strict-type-predicates | 常に true もしくは false となる型述語を警告する
|
| switch-default | switch 文は、 default ケース の 実装を必須とする
|
| triple-equals | == と != を 禁止し、 === と !== を 使用させる
|
| typeof-compare | Makes sure result of typeof is compared to correct string values.
|
| use-default-type-parameter | 明示的に指定された型引数が、その型パラメータのデフォルトである場合に警告する |
| use-isnan | NaN 定数の比較を禁止し、 isNaN() 関数を使用させる
|
Maintainability
| ルール | 概要 |
|---|---|
| cyclomatic-complexity | サイクロマティック複雑度の分析と閾値を適用する |
| deprecation | デプリケート API の 使用を警告する |
| eofline | ファイルが改行で終わるようにする |
| indent | 指定するインデントルールを適用する |
| linebreak-style | 指定する改行コードを適用する |
| max-classes-per-file | ファイル内のクラス数を制限する |
| max-file-line-count | ファイルの行数を制限する |
| max-line-length | 1行の文字数を制限する |
| no-default-export | ES6-style の デフォルト・エクスポートを禁止し、名前付きエクスポートを使用させる |
| no-duplicate-imports | 同じモジュールからの複数インポートを禁止する |
| no-mergeable-namespace | 同じファイル内のマージ可能な namespace を 禁止する
|
| no-require-imports | require() を 禁止し、新しい ES6-style import/export を 使用させる
|
| object-literal-sort-keys | オブジェクト・リテラルのキーは、アルファベット順に記述させる |
| prefer-const | 変数への割り当てが1回に限られる場合、 const を 使用させる
|
| trailing-comma | 配列とオブジェクトのリテラルで最後にカンマを付けるかのルールを強制する |
Style
| ルール | 概要 | |
|---|---|---|
| align | 指定する要素 (e.g. 引数) を 垂直方向を揃えて整列して記述させる | |
| array-type | 配列宣言を T[] もしくは Array の いずれかに統一させる
| |
| arrow-parens | Arrow-style 関数 の パラメーターで括弧を必須とする | |
| arrow-return-shorthand | () => { return x; } を () => x と させる
| |
| binary-expression-operand-order | In a binary expression, a literal should always be on the right-hand side if possible. For example, prefer ‘x + 1’ over ‘1 + x’. | |
| callable-types | コールシグネチャのみのインターフェース名やリテラル型は関数型を使用させる | |
| class-name | クラスとインターフェース名はパスカルケース(アッパーキャメルケース)にさせる | |
| comment-format | 1行コメントの書式設定ルールを強制する | |
| completed-docs | Enforces documentation for important items be filled out. | |
| encoding | UTF-8 エンコーディングを強制する | |
| file-header | すべてのファイルに対して指定する正規表現にマッチするヘッダーコメントを強制する | |
| import-spacing | import の キーワード間にスペースを入れることを強制する
| |
| interface-name | × | インターフェース名は I で 始まることを強制する
|
| interface-over-type-literal | 型リテラル( type T = {...} ) ではなく インターフェース名を使用させる
| |
| jsdoc-format | JSDoc の 基本形式ルールを強制する | |
| match-default-export-name | デフォルト・インポートには、インポートする宣言と同じ名前の使用を必須とする | |
| newline-before-return | ブロック内に return 以外の行がある場合、 return の 前に空行を必須とする
| |
| new-parens | new キーワードを使用してコンストラクタを呼び出す場合、括弧を必須とする
| |
| no-angle-bracket-type-assertion | 型アサーションに <Type> の 代わりに as Type を 使用させる
| |
| no-boolean-literal-compare | x === true のような、ブール・リテラルとの比較を警告する
| |
| no-consecutive-blank-lines | 1もしくは複数の空行を禁止する (デフォルトで 1つの空行を許可する) | |
| no-irregular-whitespace | 文字列やコメントの外側にある不規則な空白を禁止する | |
| no-parameter-properties | クラス・コンストラクタでのパラメーター・プロパティを禁止する | |
| no-reference-import | <reference types="foo" /> の 使用を禁止する
| |
| no-trailing-whitespace | 行末尾の空白を禁止する | |
| no-unnecessary-callback-wrapper | Replaces x => f(x) with just f. To catch more cases, enable only-arrow-functions and arrow-return-shorthand too.
| |
| no-unnecessary-initializer | var let destructuring initializer の undefined 初期化を禁止する
| |
| no-unnecessary-qualifier | Warns when a namespace qualifier (A.x) is unnecessary.
| |
| number-literal-format | 小数点以下のリテラルは 0. で 始まり、末尾が 0 で 終わらないこと強制する
| |
| object-literal-key-quotes | Enforces consistent object literal property quote style.
| |
| object-literal-shorthand | 可能であれば ES6-style オブジェクト・リテラル の ショートハンドを強制する | |
| one-line | 特定の予約語 (e.g. try の } と catch) を同一行にさせるかのルールを強制する
| |
| one-variable-per-declaration | 複数の変数を同時定義することを禁止する | |
| ordered-imports | import を アルファベット順に記述することを強制する
| |
| prefer-function-over-method | Warns for class methods that do not use ‘this’. | |
| prefer-method-signature | インターフェースと型の定義を foo: () => void でなく foo(): void を 使用させる
| |
| prefer-switch | Prefer a switch statement to an if statement with simple === comparisons.
| |
| prefer-template | 文字列の連結ではなく、テンプレート式を使用させる | |
| quotemark | 文字列リテラルを、一重引用符 または 二重引用符 の 指定する方に強制する | |
| return-undefined | Void 関数 では return; を、値を返す関数では return undefined; を 使用させる
| |
| semicolon | すべてのステートメントの最後に一貫したセミコロンの使用を強制する | |
| space-before-function-paren | 関数の括弧前に入れるスペースのルールを強制する | |
| space-within-parens | 括弧内のスペースのルールを強制する | |
| switch-final-break | switch の 最終節 が break で 終わるかのルールを強制する
| |
| type-literal-delimiter | Checks that type literal members are separated by semicolons. Enforces a trailing semicolon for multiline type literals. | |
| variable-name | 変数名のルールを強制する | |
| whitespace | 空白スタイルのルールを強制する |
TypeScript の コーディング量が足りていないので、どのようなコードを指しているのか想像がつかないものもかなりありました.
あと cyclomatic-complexity が あるのがいいですね.
先に設定を悩むより、圧倒的なコーディング量を背景に、よろしくないコードを防ぐことをした方がよかったかもと思いつつ、理解が深まったのでよしとしましょう. 次は、設定を考えたいと思います.

