Siderで使っているTSLintの設定

今のところこんなんです。

{
  "extends": [
    "tslint:latest",
    "tslint-immutable"
  ],
  "rules": {
    "array-type": false,
    "arrow-parens": false,
    "interface-name": false,
    "interface-over-type-literal": false,
    "max-classes-per-file": false,
    "max-line-length": false,
    "member-access": false,
    "object-literal-key-quotes": [true, "as-needed"],
    "object-literal-shorthand": false,
    "object-literal-sort-keys": false,
    "ordered-imports": false,
    "quotemark": false,
    "semicolon": false,
    "trailing-comma": false,
    "variable-name": [
      true,
      "ban-keywords",
      "check-format",
      "allow-leading-underscore",
      "allow-pascal-case"
    ],
    "whitespace": false,
    "no-angle-bracket-type-assertion": false,
    "no-shadowed-variable": false,
    "no-namespace": false,
    "readonly-keyword": [true, "ignore-class"],
    "no-trailing-whitespace": false,
    "no-implicit-dependencies": [true, ["i18n-js"]],
    "no-submodule-imports": false
  }
}

特に解説はないのですが、

  • スタイル関連は基本的に無効
  • なんか怒られる度に無効にしていく
  • == って書くと怒るやつは欲しい

みたいな雑な設定でやっています。

一つだけ有効にしているプラグインがあって、tslint-immutableです。これは我々がreduxを使っているからで、stateのためのinterfaceのattributeをimmutableにするのを忘れないようにしています。このプラグインはなかなか便利なのですが、一つ問題があって、ある種の型適用に immutable と書きたくないという話があります。

こんなん。

const routes = {
  assignSeat: new ApiRoute<{orgId: number, memberId: number}>(
    "/api/c/gh/orgs/:orgId/members/:memberId/seat_assignments"
  )
}

const url = routes.assignSeat.stringify({ orgId: 123, memberId: 456 })

このApiRouteというのは、APIリクエストとかで使うURL生成のためのクラスで、 orgId に文字列を渡したり null が入ったりすることを防げる優れものですが、ここでいちいち readonly と書きたくないという問題があります。良い感じのオプションがないし、どんなときに readonly と書かなくて良いかしばらく考えたけど判定方法を思いつかないので、もう諦めてしまって誤爆が出ると無視するようにしています。(Siderを使います。)