Kako dobiti ključ enum-a po vrijednosti u Typescriptu?


Imam enum ovakav:

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

Možete li mi reći kako dobiti ključ enum-a prema vrijednosti, molim? Na primjer, trebam proslijediti "PLAVA BOJA" i dobiti 'PLAVA'.

Colors["BLUE COLOR"] daje grešku Element implicitno ima tip 'any' jer se izraz tipa '"BLUE COLOR"' ne može koristiti za indeksiranje tipa 'typeof Colors'. Svojstvo 'BLUE COLOR' ne postoji na tipu 'typeof Colors'.

Odgovor #1

Ako želite dobiti ključ vašeg enuma prema vrijednosti, u tom slučaju morate prepisati vaš enum na sljedeći način: Ali isti format također bi mogao raditi i u starijim verzijama.

Za Vanilla Js to bi trebalo izgledati ovako: :

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

Za .tsx to bi trebalo biti ovako: :

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

Za .ts to bi trebalo biti ovako: :

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

Tada možete dobiti ovako:

Dohvati ključ enumeracije prema vrijednosti: :

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

Izlaz: :

Drugi način: Dohvati ključ enum-a prema vrijednosti: :

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

console.log(enumKey);

Izlaz: :

Test na jsfiddleu: :

Primjer koda na jsfiddle

Napomena: Objavljeno je novo priopćenje 25. kolovoza s TypeScript 4.8. Molimo vas da budete svjesni toga. Možete pogledati ovdje.

Odgovor #2

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

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

Odgovor #3

Koristim ovu funkciju

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] : '';
}

Testovi s 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');
  });
});

Nadam se da će nekome pomoći

Odgovor #4

Poboljšano getEnumKeyByEnumValue bez korištenja 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] : '';
}

Povezani članci