Pesquisa de site

TypeScript - copiando propriedades de objeto com exclusões


Existe uma maneira em TS de copiar propriedades para outro objeto excluindo algumas delas sem usar um loop? Se eu tiver dois objetos de interfaces dadas que compartilham algumas propriedades, posso copiar um para outro usando o operador spread, mas isso também copia propriedades adicionais do objeto original. Na prática, eu gostaria de copiar apenas as que se intersectam.

Resposta #1

Se você está procurando criar um objeto contendo a interseção de duas propriedades de um objeto, você pode fazê-lo manualmente ou procurar por bibliotecas que façam isso. Uma popular para tais manipulações é lodash e ela possui funções úteis para resolver isso, como intersection :

var a = { 'a': 1, 'b': 2, 'c': 3 };
var b = { 'c': 3, 'd': 4, 'e': 5 };

_.intersection(_.keys(a), _.keys(b)); // ['c']

Embora, se você quiser tipos correspondentes, será necessário instalar typings mantidos pela comunidade (neste pacote), pois o lodash não fornece esses tipos por si próprio.

Resposta #2

Pelo que eu entendo da pergunta, você está tentando intersectar duas interfaces em TypeScript. Se isso estiver correto, então você está procurando uma maneira de intersectar dois tipos em TypeScript.

Embora não exista um tipo genérico na biblioteca padrão que faça isso, existe uma biblioteca que contém muitos tipos genéricos utilitários para realizar operações como essa em tipos.

Aqui está o tipo Intersection da biblioteca utility-types :

Intersection<T, U>

De T escolha propriedades que existem em U

Uso do README deles:

import { Intersection } from 'utility-types';

type Props = { name: string; age: number; visible: boolean };
type DefaultProps = { age: number };

// Expect: { age: number; }
type DuplicatedProps = Intersection<Props, DefaultProps>;

Isso efetivamente cria um tipo contendo apenas as propriedades que existem em ambos os seus tipos. Você ainda precisa ter cuidado com o que acontece se uma propriedade existir em ambos, mas com definições diferentes. Aqui, a definição de T terá precedência sobre o tipo definido em U.