Использование TypeScript Union Types с условным (троичным) оператором - PullRequest
0 голосов
/ 30 сентября 2019

Я получаю загадочное сообщение об ошибке при использовании двух пользовательских типов Typecsipt 'OptionsPostData3 | OptionsPostData4' (временное имя извините) и троичный оператор при использовании только OptionsPostData3 или только OptionsPostData4 одна половина или другая половина моего кода не получаетсообщение об ошибке ...

Мой код выглядит следующим образом

const postData: OptionsPostData3 | OptionsPostData4 =
      !!optionIds && optionIds.length > 0
        ? {
            optionIds,
          }
        : {
            filters: [
              {
                underlyingId,
                expiryDate,
                optionType: optionType || void 0,
                minstrikePrice: minstrikePrice || 0,
                maxstrikePrice: maxstrikePrice || 0,
              },
            ],
          };

Мне не повезло, когда я пытался найти решение в Интернете, и, вероятно, это очевидно (или, возможно, нет), чтобы найтиРешение в загадочном сообщении об ошибке, но я не знаю, что мне делать ...

Типы определены следующим образом

export type OptionsPostData3 = {
  filters: Filters[];
};
export type OptionsPostData4 = { optionIds: number[] };

export interface OptionsIdArray {
  optionIds: number[];
}

export interface FiltersArray {
  filters: Filters[];
}

export interface Filters {
  underlyingId: number;
  expiryDate: string;
  optionType: string;
  minstrikePrice: number;
  maxstrikePrice: number;
}

Я думаю, что сообщение об ошибке может предоставить достаточно информациичтобы решить мою проблему, но я не нашел, как ... И я хочу, чтобы избежать использования ключевого слова типа any:

Сообщение об ошибке выглядит следующим образом

Type '{ optionIds: number[]; } | { filters: { underlyingId: number | undefined; expiryDate: string | undefined; optionType: string | undefined; minstrikePrice: number; maxstrikePrice: number; }[]; }' is not assignable to type 'OptionsPostData4 | OptionsPostData3'.
  Type '{ filters: { underlyingId: number | undefined; expiryDate: string | undefined; optionType: string | undefined; minstrikePrice: number; maxstrikePrice: number; }[]; }' is not assignable to type 'OptionsPostData4 | OptionsPostData3'.
    Type '{ filters: { underlyingId: number | undefined; expiryDate: string | undefined; optionType: string | undefined; minstrikePrice: number; maxstrikePrice: number; }[]; }' is not assignable to type 'OptionsPostData3'.
      Types of property 'filters' are incompatible.
        Type '{ underlyingId: number | undefined; expiryDate: string | undefined; optionType: string | undefined; minstrikePrice: number; maxstrikePrice: number; }[]' is not assignable to type 'Filters[]'.
          Type '{ underlyingId: number | undefined; expiryDate: string | undefined; optionType: string | undefined; minstrikePrice: number; maxstrikePrice: number; }' is not assignable to type 'Filters'.
            Types of property 'underlyingId' are incompatible.
              Type 'number | undefined' is not assignable to type 'number'.
                Type 'undefined' is not assignable to type 'number'.ts(2322) 

, если вам нужнополный проект в качестве ссылки это ссылка на GitHub, он начинается в строке 20

1 Ответ

1 голос
/ 30 сентября 2019

Аргументы в сигнатуре вашей функции , используемые для создания объекта, не соответствуют определенным интерфейсам. Два варианта - ослабить типы в интерфейсе Filters или сузить типы аргументов, чтобы они соответствовали типам в Filters (например: добавить значения по умолчанию / удалить возможность undefined.

interface Filters {
  underlyingId?: number;
  expiryDate?: string;
  optionType?: string | null;
  minstrikePrice?: number | null;
  maxstrikePrice?: number | null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...