Заполните только те поля, которые определены в интерфейсе - PullRequest
0 голосов
/ 13 марта 2020

Я создаю службу корзины покупок, которая использует метод для добавления переданного объекта JSON к объекту корзины. Но должны быть заполнены только определенные поля в интерфейсе IProduct.

JSON Object

{
    "title": "Title 1",
    "descriptionHtml": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore.",
    "vendor": "1",
    "variants": [
        {
            "id": "aaaa",
            "price": "12.95",
            "quantity": "1"
        }
    ],
    "images": [
        {
            "transformedSrc": "https://path/to/image"
        }
    ],
    "filters": [
        "Pizza"
    ],
    "ratings": "1321"
}
import { Injectable } from '@angular/core';

export interface IProduct {
    title: string;
    descriptionHtml: string;
    vendor: string;
    variants?: (VariantsEntity)[] | null;
    images?: (ImagesEntity)[] | null;
}

export interface VariantsEntity {
    id: string;
    price: string;
    quantity: string;
}

export interface ImagesEntity {
    transformedSrc: string;
}

@Injectable({
    providedIn: 'root'
})

export class CartService
{
    cart: IProduct[] = [];

    constructor() { }

    setProduct(product)
    {
        this.cart.push(product);
    }
}

Использование this.cart.push(product) толкает весь JSON объект. Но мне не нужны такие поля, как «фильтры», «рейтинги».

Существует ли возможность с Typescript создавать только действительные поля интерфейса?

РЕДАКТИРОВАТЬ: Какие возможности у меня есть здесь?

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Нашел решение, которое работает для меня с Spread Operator

const {ratings, filters, ...filteredProduct} = product;
this.cart.push(filteredProduct);
0 голосов
/ 13 марта 2020

Есть ли возможность с Typescript, что создаются только фактические поля интерфейса

Вы ищете Exact Types. Они не поддерживаются изначально в данный момент.

Дальнейшее обсуждение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...