Union
Descreve um schema que é a união de vários schemas. É útil quando você precisa do comportamento polimórfico oferecido por schema.Array ou Values, mas para campos que não são coleções.
definition: obrigatório Um objeto que mapeia a definição das entities aninhadas encontradas no array de entradaschemaAttribute: obrigatório O atributo de cada entity encontrada que define qual schema, de acordo com o mapeamento de definição, será usado na normalização. Pode ser uma string ou uma função. Se for uma função, recebe os seguintes argumentos:value: O valor de entrada da entity.parent: O objeto pai do array de entrada.key: A chave sob a qual o array de entrada aparece no objeto pai.
Métodos de instância
define(definition): Quando usado, odefinitionrecebido é mesclado com a definição original passada ao construtor deUnion. Este método costuma ser útil para criar referências circulares no schema.
Nomenclatura
Union tem esse nome por causa do conceito da teoria dos conjuntos, assim como as Unions do TypeScript
Uso
observação
Se os dados retornarem um objeto para o qual você não forneceu um mapeamento, o objeto original será retornado no resultado e nenhuma entity será criada.
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▶
schemaAttribute como função
Quando o valor discriminador não corresponde diretamente às chaves do schema, use uma função para calcular qual schema usar.
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 do Github
A atividade de contribuição vem do agrupamento de eventos do github por tipo. Cada tipo de Event tem seu
próprio schema distinto, e é por isso que usamos Union
Explore o exemplo github-app