Saltar al contenido principal

Union

Describe un schema que es la unión de varios schemas. Es útil si necesitas el comportamiento polimórfico que ofrecen schema.Array o Values, pero para campos que no son colecciones.

  • definition: obligatorio Un objeto que asigna la definición de las entidades anidadas que se encuentran dentro del array de entrada
  • schemaAttribute: obligatorio El atributo de cada entidad encontrada que define qué schema, según el mapeo de la definición, se usará al normalizar. Puede ser un string o una función. Si se da una función, recibe los siguientes argumentos:
    • value: El valor de entrada de la entidad.
    • parent: El objeto padre del array de entrada.
    • key: La clave con la que aparece el array de entrada en el objeto padre.

Métodos de instancia​

  • define(definition): Cuando se usa, la definition que se pasa se combinará con la definición original pasada al constructor de Union. Este método suele ser útil para crear referencias circulares en el schema.
Nomenclatura

Union recibe su nombre del concepto de la teoría de conjuntos, igual que las Unions de TypeScript

Uso​

nota

Si tus datos devuelven un objeto para el que no proporcionaste un mapeo, el objeto original se devolverá en el resultado y no se creará una entidad.

Fixtures
GET /feed
[{"id":1,"type":"link","url":"https://ntucker.true.io","title":"Nate site"},{"id":10,"type":"post","content":"good day!"}]
▶api/Feed
import { Entity, RestEndpoint, Union } from '@data-client/rest';

export abstract class FeedItem extends Entity {
  readonly id: number = 0;
  declare readonly type: 'link' | 'post';
}
export class Link extends FeedItem {
  readonly type = 'link' as const;
  readonly url: string = '';
  readonly title: string = '';
}
export class Post extends FeedItem {
  readonly type = 'post' as const;
  readonly content: string = '';
}
export const getFeed = new RestEndpoint({
  path: '/feed',
  schema: [
    new Union(
      {
        link: Link,
        post: Post,
      },
      'type',
    ),
  ],
});
▶FeedList
Resultado
Store▶

Función schemaAttribute​

Cuando el valor discriminador no coincide directamente con las claves del schema, usa una función para calcular qué schema utilizar.

Fixtures
GET /feed
[{"id":1,"type":"link","url":"https://ntucker.true.io","title":"Nate site"},{"id":10,"type":"post","content":"good day!"}]
▶api/Feed
import { Entity, RestEndpoint, Union } from '@data-client/rest';

export abstract class FeedItem extends Entity {
  readonly id: number = 0;
  declare readonly type: 'link' | 'post';
}
export class Link extends FeedItem {
  readonly type = 'link' as const;
  readonly url: string = '';
  readonly title: string = '';
}
export class Post extends FeedItem {
  readonly type = 'post' as const;
  readonly content: string = '';
}
export const getFeed = new RestEndpoint({
  path: '/feed',
  schema: [
    new Union(
      {
        links: Link,
        posts: Post,
      },
      (input: Link | Post, parent: unknown, key: string) => `${input.type}s`,
    ),
  ],
});
▶FeedList
Resultado
Store▶

Eventos de Github​

La actividad de contribución proviene de agrupar los eventos de github por su tipo. Cada tipo de Event tiene su propio schema distinto, y por eso usamos Union

Explora el ejemplo github-app

More Demos