ค้นหาเว็บไซต์

TypeScript - กฎ ESLint สำหรับการไม่ใช้ enum ที่ไม่ได้ใช้งาน


มีกฎ no-unused-vars ของ eslint ที่สามารถแจ้งเตือน/แสดงข้อผิดพลาดหากมีตัวแปรที่ไม่ได้ใช้งาน: https://eslint.org/docs/rules/no-unused-vars

ถ้าฉันต้องการตรวจสอบให้แน่ใจว่าไม่มี enums ที่ไม่ได้ใช้งาน กฎ lint ที่ดีที่สุดในการใช้งานคืออะไร?

ตัวอย่างสถานการณ์:

export enum MyEnum {
  ONE = 'ONE',
  TWO = 'TWO',
  THREE = 'THREE',
}

ที่นี่ MyEnum.ONE และ MyEnum.TWO ถูกใช้ทั้งคู่ แต่ MyEnum.THREE ไม่ได้ถูกอ้างอิง

if (type === MyEnum.ONE) {
  ...
}

if (type === MyEnum.TWO) {
  ...
}

มันคงดีมากถ้ากฎการตรวจสอบโค้ดสามารถแจ้งเตือน/แสดงข้อผิดพลาดว่า MyEnum.THREE ไม่ถูกใช้งาน เพื่อที่จะสามารถลบมันได้

คำตอบ #1

ไม่มีข้อกำหนดที่มีอยู่สำหรับการทำเช่นนี้ ดังนั้นคุณจึงมีตัวเลือกสองสามข้อ:

  1. เขียนกฎของคุณเอง (แล้วเผยแพร่มันให้พวกเราที่เหลือใช้!)
  2. ถ้าคุณใช้ IntelliJ จะมีการตรวจสอบใน IDE ("สัญลักษณ์ทั่วโลกที่ไม่ได้ใช้งาน") ที่สามารถให้คำเตือนคุณได้

อย่างไรก็ดี ให้แน่ใจว่าคุณกำลังใช้เวอร์ชัน Typescript ของกฎ no-unused-vars แม้ว่าจะเป็นเช่นนั้น มันก็ยังไม่ตรวจพบตัวแปรที่ส่งออกแล้วไม่ได้ใช้งานเพราะแต่ละไฟล์ถูกวิเคราะห์แยกกัน

คำตอบ #2

ตอบคำถามของตัวเองทีหลังที่นี่ ผมพบว่าการใช้สวิตช์อย่างละเอียดในโค้ดและ "การตรวจสอบความครบถ้วนของสวิตช์" เป็นรูปแบบที่ยั่งยืนที่สุด

https://typescript-eslint.io/rules/switch-exhaustiveness-check/

พิจารณาเพิ่มสิ่งนี้ลงใน eslintrc ของคุณ (เช่น .eslintrc.js ของฉัน)

    // Exhaustive switches
    '@typescript-eslint/switch-exhaustiveness-check': [
      'warn',
      { allowDefaultCaseForExhaustiveSwitch: false },
    ],

ดังนั้นทุกครั้งที่คุณใช้ enums คุณต้องใช้คำสั่ง switch หากคุณเพียงแค่เขียนบรรทัดแรกของ switch ที่ value เป็น MyEnum,

switch (value) {

eslint แสดง

Switch is not exhaustive. Cases not matched: etc... eslint@typescript-eslint/switch-exhaustiveness-check

สิ่งที่ดีที่สุดคือ VSCode มี "การแก้ไขด่วน" ที่สร้างกรณีทั้งหมด ในขณะที่การเพิ่มกรณีสำหรับแต่ละ enum อาจจะน่าเบื่อเล็กน้อย แต่ฉันพบว่ารหัสที่ใช้ default มักสร้างบั๊กที่ยากต่อการค้นหา มันยังมีประโยชน์ในการแนะนำผู้พัฒนารายใหม่เมื่อพวกเขานำค่า enum ใหม่ไปใช้งาน เพราะสวิตช์ทั้งหมดในรีโปจะต้องปรับแก้ lint

และเพื่อตอบคำถามต้นฉบับนี้ กลยุทธ์สวิตช์แบบครบถ้วนยังช่วยให้สามารถค้นหาและลบเส้นทางโค้ดที่ตายแล้วได้ง่ายเนื่องจากทุก enum ต้องถูกใช้งาน