Почему эти типы несовместимы?

У меня есть такой тип значения:

export type Value = {
   __typename?: 'Value',
  key?: Maybe<Scalars['String']>,
  label?: Maybe<Scalars['String']>,
  value?: Maybe<Scalars['String']>,
};

И тип результата запроса (сгенерированные хуки apollo) вроде этого:

Maybe<Maybe<{
    __typename?: "Value" | undefined;
} & Pick<Value, "key" | "label" | "value">>[]>

Я пытаюсь передать результат этого запроса функции:

const getValues = (contacts: Value[]) => {
  const values = contacts.map(e => e["value"]);
  return values;
};

По какой-то причине TypeScript говорит, что эти типы несовместимы. Мой вызов функции:

getValues( dataFilters!.caseListFilters!.contacts ) 

Ошибка TypeScript:

Argument of type 'Maybe<Maybe<{ __typename?: "Value" | undefined; } & Pick<Value, "key" | "label" | "value">>[]>' is not assignable to parameter of type 'Value[]'.
  Type 'null' is not assignable to type 'Value[]'.ts(2345)

Может ли кто-нибудь помочь мне понять, что не так с этими типами? Я знаю, что as Value[] решает проблему, но не знаю почему.

getValues( dataFilters!.caseListFilters!.contacts as Value[] //no error )

person platinum_ar    schedule 04.03.2020    source источник


Ответы (1)


У вас есть типы Maybe, которые имеют значение NULL более высокого порядка. Итак, хотя вы утверждаете, что они не undefined используют !, вы утверждаете, что на самом деле они Maybe. Вещь типа Maybe, когда она есть там, по-прежнему имеет только возможно значение.

Возможно, вам нужно безопасно развернуть значение, чтобы получить гарантированное значение.

Откуда тип Maybe? Sanctuary.js? фп-тс? Перейдите к разделу «Определение» и выясните, какой тип Maybe вы используете, а затем прочтите документацию. Вам нужно извлечь из этого пользу.

person Josh Wulf    schedule 05.03.2020
comment
Спасибо, но я понимаю только первую часть вашего ответа. Что значит безопасно развернуть ценность? Я наткнулся на истинный миф, где говорится о разворачивании Just and Nothing, но все, что я нашел относительно моей реализации Maybe, таково: export type Maybe<T> = T | null; - person platinum_ar; 11.05.2020