Upgrade to Pro — share decks privately, control downloads, hide ads and more …

チーム開発における自作ESLintルールの活用と戦略

SansanTech
September 12, 2023

 チーム開発における自作ESLintルールの活用と戦略

■イベント
TypeScriptを活用した型安全なチーム開発
https://sansan.connpass.com/event/292695/

■登壇概要
タイトル:チーム開発における自作ESLintルールの活用と戦略
登壇者:技術本部 Digitization部 Bill One Entryグループ 薩󠄀田 和弘

■Digitization部 エンジニア 採用情報
https://media.sansan-engineering.com/digitization

SansanTech

September 12, 2023
Tweet

More Decks by SansanTech

Other Decks in Technology

Transcript

  1. !⽥ 和弘 Sansan株式会社 Digitization部 Bill One Entry Group 2021年 Sansan中途⼊社。

    以降Bill One Entry Groupとして、請求書のデータ化に向き合う。
  2. 実装(実際にはもうちょい多いです) MemberExpression(node: MemberExpression & Rule.NodeParentExtension) { const { object: parentNode,

    property: targetProperty } = node; const { object: parentObject, property: parentProperty } = parentNode; if ( parentObject.name === "process" && parentProperty.name === "env" && targetProperty.name === "NODE_ENV" ) { // エラーレポート } }
  3. ESLint以外で解決できないか? expressのハンドラの型はデフォルトで⾮常に緩い × NG ◦ OK (req: Request) => {

    req.params // => any } (req: Request<Users.GetUser.RequestParams>) => { req.params // => { userId: string } } 最初はESLintでRequestの型引数を強制しようと思ったが...。
  4. ESLint以外で解決できないか? 我々は習慣的にexpressのRequestHandlerを利⽤していた type RequestHandler<P = never, ResBody = never, ...>

    = express.RequestHandler<P, ResBody, …>; const handler: RequestHandler = (req) => { req.params // never } より厳しい型のRequestHandlerを⽤意することで解決した。
  5. Lintとは - コードのパターンによって検証を⾏う - 静的解析である - ロジックに関してはテストで回避する - バグを事前検知する -

    今まで発⽣したバグや、チーム内で統⼀するべきもの に対して⾏う - フォーマット等例外もある ESLintでなければならないルール
  6. チーム内で発⽣したインシデント エラーが発⽣した場合、res.sendがされていなかった。 結果動作が想定した挙動にならなかった。 × NG ◦ OK const handler =

    (req, res) => { try { const result = someFunction(); res.send(result); } catch (e) { return; } } const handler = (req, res) => { try { const result = someFunction(); res.send(result); } catch (e) { res.sendStatus(500); } }
  7. - ESLintのルールを作るという発想を持つ - 作るルールは考える - すでに同じルールが作られていないか - ESLintで本当に解決すべきか? - チーム特有の事象はベスト

    - ESLintは基本はコードのパターンに対する注意 - インシデント・ヒヤリハットの再発防⽌策として仕組 み化できないか、1つの⼿札として使う まとめ
  8. ESLintを⾜がかりに「エコシステムを活⽤する」 - VSCode / Vim / Emacsの拡張・プラグイン - TypeScript Language

    Service Plugin - 意外に使い所は少ないので使ったことはないけど...。 ハンマーを増やす
  9. - ESLintのルールを作るという発想を持つ - 作るルールは考える - すでに同じルールが作られていないか - ESLintで本当に解決すべきか? - チーム特有の事象はベスト

    - ESLintは基本はコードのパターンに対する注意 - インシデント・ヒヤリハットの再発防⽌策として仕組 み化できないか、1つの⼿札として使う まとめ