Búsqueda de sitios web

genéricos - Tipo de unión parcial en Typescript


Me está resultando difícil averiguar cómo escribir algo así:

type WithFallback<Fallback extends string, FallbackType> = {
  [fallback in Fallback]: FallbackType
} & { [rest: string]: Partial<FallbackType> };

Entonces, generalmente, este tipo toma una clave Fallback y su tipo de valor FallbackType, y crea un diccionario de un par clave-valor {[key: Fallback]: FallbackType} y cualquier otra clave con valores del tipo Partial<FallbackType>.

Debería comportarse como un diccionario con valores de respaldo (base) y sus variaciones:

const values = {
  base: {
    valueA: "baseA",
    valueB: "baseB",
  },
  context1: {
    valueA: "context1A",
  },
  context2: {
    valueB: "context2B",
  },
};

const useContextValues = <BaseContext extends string, BaseValuesDictionary>(
  base: BaseContext,
  values: WithFallback<BaseContext, BaseValuesDictionary>,
): BaseValuesDictionary => {
  const [activeContext, setContext] = useState<keyof typeof values>(base);

  const context = { ...values[base], ...values[activeContext] };

  return context;
};

De esta manera, en el contexto base nuestros valores deberían ser iguales a baseA y baseB, en context1 - contest1A y baseB, en context2 - baseA y context2B.

Pero, cuando espero que useContextValues devuelva typeof values.base={valueA: string, valueB: string}, se resuelve en esto:

Además, cuando los valores se pasan de esta manera, se resuelven a un tipo diferente:

¿Puedo arreglarlo de alguna manera? ¿O tal vez no se supone que funcione en absoluto?

Artículos relacionados