Búsqueda de sitios web

Typescript: Omitir una propiedad en una interfaz, cuando otra propiedad dentro de la misma interfaz es igual a un cierto valor de un enum


Me gustaría 'Omitir' una propiedad en una interfaz cuando otra propiedad dentro de esa misma interfaz es igual a un cierto valor en un enum. Sin embargo, esto DictionaryValue['type'] extends FieldType.ARRAY siempre es igual a falso.

No quiero hacer que la propiedad sea opcional por defecto ya que esto posiblemente resultaría en errores de tipo en mi código.

enum FieldType {
  STRING,
  NUMBER,
  ARRAY
}

interface DictionaryValue {
  type: FieldType,
  value: number
}

interface Dictionary<T extends string> {
  [key in T]: DictionaryValue['type'] extends FieldType.ARRAY ?
    Omit< DictionaryValue, 'value'> :
    DictionaryValue
}

Respuesta #1

DictionaryValue['type'] siempre será FieldType. Un tipo se define tal como es, no en función de lo que pueda contener cuando declaras una variable del tipo.

Deberías considerar tener una unión para DictionaryValue que contenga los tipos reales que deseas para los valores en el diccionario:

type DictionaryValue = {
    type: Exclude<FieldType, FieldType.ARRAY>,
    value: number
} | {
    type: FieldType.ARRAY
}

Enlace del parque