TypeScript: как объединить объект из другого интерфейса? - PullRequest
1 голос
/ 22 апреля 2019

У меня есть следующие интерфейсы:

interface TxInterface {
    field1: string;
    field2: string;
    field3: number;
}

interface RxInterface {
    field1: string;
    field2: string;
    field3: number;
    field4: string;
    field5: string;
}

Когда я получаю объект с сервера, он набирается с помощью RxInterface. В моем приложении я продолжаю использовать этот объект, когда обновляю значения, например.

Когда я хочу обновить объект на сервере, я отправлю "TxInterface", который содержит некоторые поля "RxInterface".

Итак, как я могу легко объединить мой объект из RxInterface в TxInterface перед отправкой и взять только поля TxInterface?

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Нет никакого способа сделать это только с определениями интерфейса, так как такие определения являются частью системы типов, которая стирается во время выполнения. Если вам нужно что-то сделать во время выполнения, вам нужно написать код, который делает это во время выполнения. В данном случае вот общая функция, которая извлекает только свойства объекта, соответствующего списку ключей:

function extract<T extends object, K extends keyof T>(
    obj: T,
    keys: K[]
): Pick<T, K> {
    const ret = {} as Pick<T, K>;
    keys.forEach(k => ret[k] = obj[k])
    return ret;
}

А для вашего конкретного случая использования вы можете создать функцию преобразования, типы которой включают в себя RxInterface и TxInterface, но в которой в качестве значений указываются конкретные ключи, а не типы:

const rxToTx = (rx: RxInterface): TxInterface => // type annotation here
    extract(rx, ["field1", "field2", "field3"]); // explicit key values here

И вы можете убедиться, что это работает:

const rx: RxInterface = {
    field1: "yes",
    field2: "yep",
    field3: 100,
    field4: "no",
    field5: "nope"
}

const tx = rxToTx(rx);

console.log(tx);
// {field1: "yes", field2: "yep", field3: 100}

Надеюсь, это поможет; удачи!

0 голосов
/ 22 апреля 2019

Хорошо. Это хорошая отправная точка для введения бинарных операций, также известных как «сокращения».

Рассмотрим сигнатуру общей функции: T -> T -> T. Он принимает два параметра одного типа T и каким-то образом «сворачивает» их в один результирующий экземпляр того же типа T. В качестве тривиального примера возьмем + на number с или конкатенацию на string с.

Оказывается, что такая бинарная операция невероятно распространена в различных областях математики и основана на гораздо более надежных причинах, чем просто удобство программирования. Например, « полугруппа » по сути является той же самой двоичной операцией с несколькими дополнительными свойствами, я не буду здесь объяснять.

Так что, не игнорируйте это. Скорее разработайте свой код таким образом, чтобы вы могли использовать двоичные операции вышеупомянутой (общей) подписи. Вопрос в том, как? Mapping! Вы когда-нибудь слышали что-то о подходе «карта / уменьшение»? Это именно то, что вы собираетесь реализовать: сначала отобразите невосстановимый экземпляр в приводимый, а затем примените одно из сокращений, которое у вас есть, чтобы вычислить окончательный результат.

P.S. В вашем случае отображение будет тривиальным: просто укажите явно общие параметры, поскольку более широкий интерфейс также удовлетворяет более узкому интерфейсу.

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