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 entradaschemaAttribute: 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, ladefinitionque se pasa se combinará con la definición original pasada al constructor deUnion. 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