Hapus entri dari enum ketikan

Nov 09 2020

Saya memiliki enum

export enum FloorTypeEnum {
  ENGINEERED_HARDWOOD = 'engineered_hardwood',
  SOLID_HARDWOOD = 'solid_hardwood',
  LAMINATE = 'laminate',
  LVT_VINYL = 'vinyl',
  CARPET = 'carpet',
  RUG = 'rug',
  CERAMIC = 'ceramic',
  CONCRETE = 'concrete',
  EPOXY = 'epoxy',
  FLOOR = 'floor', // deprecated value for backward compatibility
}

Jadi di satu tempat, saya ingin menggunakan enum ini tetapi menghapus nilai deprecated ( Floor). Apakah ada cara yang bisa kami lakukan?

Saya telah mencoba di bawah ini

export type NewFloorTypeEnum = { 
    [key in Exclude<FloorTypeEnum , FloorTypeEnum .Floor> ]?: string
 };

Saya juga mempertahankan enum warisan

export enum LegacyFloorTypeEnum {
 FLOOR = 'floor'
}

Tapi saya bingung bagaimana menggunakan tipe itu. Saya ingin menggunakan kunci dan nilai enum dan kembali ke frontend. Persyaratan utamanya adalah mendapatkan enum yang setara dengan FloorTypeEnum - LegacyFloorTypeEnum. Saya tidak ingin membuat enum baru untuk nilai lantai baru.

Terima kasih

Jawaban

Dom Nov 10 2020 at 06:10

Jika saya memahami Anda dengan benar, apakah hal seperti ini sudah cukup?

export enum FloorTypeEnum {
  ENGINEERED_HARDWOOD = 'engineered_hardwood',
  SOLID_HARDWOOD = 'solid_hardwood',
  LAMINATE = 'laminate',
  LVT_VINYL = 'vinyl',
  CARPET = 'carpet',
  RUG = 'rug',
  CERAMIC = 'ceramic',
  CONCRETE = 'concrete',
  EPOXY = 'epoxy',
  FLOOR = 'floor', // deprecated value for backward compatibility
}

enum LegacyFloorTypeEnum {
  FLOOR = 'floor',
  NOT_FLOOR = 'not_floor'
 }

type NewFloorTypeEnum<T> = {
  [K in keyof T]: T[K];
}

// test case
const ok: NewFloorTypeEnum<FloorTypeEnum> = LegacyFloorTypeEnum.NOT_FLOOR;

Saya tidak percaya bahwa Ketik dapat memblokir LANTAI karena keduanya berbagi kunci / nilai yang sama (saya mungkin salah dalam asumsi ini, jadi silakan ambil dengan sebutir garam). Namun, jika Anda memiliki nilai baru, dalam contoh yang saya gunakan NOT_FLOOR, kesalahan akan muncul jika Anda mencoba menggunakan nilai dalam enum yang tidak cocok dengan FloorTypeEnum.

Beri tahu saya jika ini tidak memenuhi kebutuhan Anda. Selamat membuat kode.