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

วิธีการหาคีย์ของ enum จากค่าของมันใน Typescript?


ฉันมี enum แบบนี้:

export enum Colors {
    RED = "RED COLOR",
    BLUE = "BLUE COLOR",
    GREEN = "GREEN COLOR"
}

คุณช่วยบอกฉันได้ไหมว่าจะหาคีย์ของ enum จากค่าได้อย่างไร เช่น ฉันต้องการส่ง "BLUE COLOR" แล้วได้ 'BLUE'

Colors["BLUE COLOR"] ทำให้เกิดข้อผิดพลาด Element implicitly has an 'any' type because expression of type '"BLUE COLOR"' can't be used to index type 'typeof Colors'. Property 'BLUE COLOR' does not exist on type 'typeof Colors'.

คำตอบ #1

หากคุณต้องการดึงคีย์ของ enum ของคุณโดยใช้ค่า ในกรณีนั้นคุณต้องเขียน enum ของคุณใหม่ในลักษณะดังต่อไปนี้: แต่รูปแบบเดียวกันนี้ก็อาจใช้ได้ในเวอร์ชันเก่าด้วยเช่นกัน

สำหรับ Vanilla Js ควรเป็นดังด้านล่าง: :

 enum Colors {
    RED = "RED COLOR",
    BLUE = "BLUE COLOR",
    GREEN = "GREEN COLOR"
}

สำหรับ .tsx ควรเป็นดังด้านล่าง: :

 enum Colors {
        RED = "RED COLOR" as any,
        BLUE = "BLUE COLOR" as any,
        GREEN = "GREEN COLOR" as any
    }

สำหรับ .ts ควรเป็นดังด้านล่าง: :

enum Colors {
  RED = <any>"RED COLOR",
  BLUE = <any>"BLUE COLOR",
  GREEN = <any>"GREEN COLOR"
}

แล้วคุณก็สามารถทำได้แบบนี้:

เรียกคีย์ enum ตามค่า: :

let enumKey = Colors["BLUE COLOR"];
    console.log(enumKey);

ผลลัพธ์: :

อีกวิธีหนึ่ง: ดึงคีย์ของ enum ตามค่า: :

let enumKey = Object.keys(Colors)[Object.values(Colors).indexOf("BLUE COLOR")];

console.log(enumKey);

ผลลัพธ์: :

ทดสอบบน jsfiddle: :

ตัวอย่างโค้ดบน jsfiddle

หมายเหตุ: มีประกาศใหม่เผยแพร่เมื่อวันที่ 25 สิงหาคม พร้อมกับ TypeScript 4.8 โปรดทราบเกี่ยวกับเรื่องนี้ คุณสามารถดูได้ที่นี่

คำตอบ #2

const findMe = Object.keys(Colors)[Object.values(Colors).indexOf("BLUE COLOR")];

https://jsfiddle.net/anniebbird/agy3unfk/3/

คำตอบ #3

ฉันกำลังใช้ฟังก์ชันนี้

export function getEnumKeyByEnumValue(myEnum: any, enumValue: number | string): string {
  let keys = Object.keys(myEnum).filter((x) => myEnum[x] == enumValue);
  return keys.length > 0 ? keys[0] : '';
}

การทดสอบด้วย jest

describe('enum', () => {
  enum TestEnumWithNumber {
    ZERO
  }

  enum TestEnumWithString {
    ZERO = 'ZERO'
  }

  it('should return correct key when enum has number values', function() {
    const key = getEnumKeyByEnumValue(TestEnumWithNumber, TestEnumWithNumber.ZERO);
    expect(key).toBe('ZERO');
  });

  it('should return correct key when enum has string values', function() {
    const key = getEnumKeyByEnumValue(TestEnumWithString, TestEnumWithString.ZERO);
    expect(key).toBe('ZERO');
  });

  it('should return correct key by passing corresponding string value', function() {
    const key = getEnumKeyByEnumValue(TestEnumWithString, 'ZERO');
    expect(key).toBe('ZERO');
  });
});

หวังว่ามันจะช่วยใครสักคนได้

คำตอบ #4

ปรับปรุง getEnumKeyByEnumValue โดยไม่ใช้ any:

export function getEnumKeyByEnumValue<
  TEnumKey extends string,
  TEnumVal extends string | number
>(myEnum: { [key in TEnumKey]: TEnumVal }, enumValue: TEnumVal): string {
  const keys = (Object.keys(myEnum) as TEnumKey[]).filter(
    (x) => myEnum[x] === enumValue,
  );
  return keys.length > 0 ? keys[0] : '';
}

บทความที่เกี่ยวข้อง