代码之家  ›  专栏  ›  技术社区  ›  ThomasReggi

在不重复的情况下取消枚举值的预测

  •  1
  • ThomasReggi  · 技术社区  · 6 年前

    我有一个这样的枚举:

    enum Animals {
     WOLF = 'wolf',
     BADGER = 'badger',
     CAT = 'cat',
    }
    

    我在贬低 CAT . 意味着数据库中的对象在读取这些对象时仍然可以拥有它,但是您不应该用 .

    我不想要的是:

    enum AnimalsIn {
     WOLF = 'wolf',
     BADGER = 'badger',
    }
    
    enum AnimalsOut {
     WOLF = 'wolf',
     BADGER = 'badger',
     CAT = 'cat',
    }
    

    有扩散/扩展的方法吗 AnimalsIn 并拥有 AnimalsOut 只包含已弃用的枚举?或者至少检查一下 动物灭绝 有所有相同的枚举 动物素 ,这意味着检查它是否是子集。

    理想的:

    type AnimalsIn = Deprecate<AnimalsOut, 'CAT'>
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Titian Cernicova-Dragomir    6 年前

    Omit

    enum AnimalsOut {
        WOLF = 'wolf',
        BADGER = 'badger',
        CAT = 'cat',
    }
    
    type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> //probably in a lib already 
    type DeprecateEnumObject<T, K extends keyof T> = Omit<T, K>
    type DeprecateEnumValues<T, K extends keyof T> = DeprecateEnumObject<T, K>[Exclude<keyof T, K>]
    
    type AnimalsIn = DeprecateEnumValues<typeof AnimalsOut, 'CAT'>
    const AnimalsIn: DeprecateEnumObject<typeof AnimalsOut, 'CAT'> = AnimalsOut;
    
    let a: AnimalsIn = AnimalsIn.BADGER;
    

    let ai: AnimalsOut.BADGER = AnimalsIn.BADGER;
    let ao: AnimalsIn.BADGER = AnimalsIn.BADGER;// error
    let ao2: typeof AnimalsIn['BADGER'] = AnimalsIn.BADGER;// more convoluted