W poniższym kodzie próbuję zrozumieć, jak współpracować z Związkiem i typami ogólnymi, ponownie wdrażając coś podobnego do Either lub Option.

type Error = {
  readonly _tag: 'error';
  status: number;
  statusText: string;
};

type Success<T> = {
  readonly _tag: 'success';
  response: T;
};

type PossibleError<T> = Error | Success<T>;

const isSuccessful = <T>(p: PossibleError<T>) => p._tag === 'success';

function fold<T>(
  onSuccess: (e: Success<T>) => void,
  onError: (a: Error) => void
): (pe: PossibleError<T>) => void {
  return pe => (isSuccessful(pe) ? onSuccess(pe.response) : onError(pe));
}

Ale pojawia się następujący błąd

error TS2339: Property 'response' does not exist on type 'PossibleError<T>'.
  Property 'response' does not exist on type 'Error'.

   return pe => (isSuccessful(pe) ? onSuccess(pe.response) : onError(pe));
                                                   ~~~~~~~~
error TS2345: Argument of type 'PossibleError<T>' is not assignable to parameter of type 'Error'.
  Type 'Success<T>' is missing the following properties from type 'Error': status, statusText

   return pe => (isSuccessful(pe) ? onSuccess(pe.response) : onError(pe));

Myślę, że maszynki nie jest w stanie opracować typ pe na podstawie funkcji My isSuccessful. Jak uzyskać odpowiednie części mojej struktury danych, aby móc coś z nimi zrobić?

Spojrzałem na tte fp-ts Wdrożenie albo i są w stanie uzyskać dostęp do .left i .right, więc nie jestem pewien, że jest inny w moim kodzie.

1
Jim Jeffries 28 lipiec 2020, 11:19

1 odpowiedź

Najlepsza odpowiedź

Jesteś blisko! Istnieją dwa problemy:

  1. Potrzebujesz p is Success<T> na swoim Funkcja strażnika typu

     const isSuccessful = <T>(p: PossibleError<T>): p is Success<T> => p._tag === 'success';
     // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^^^^^
    
  2. Próbujesz przejść pe.response, a nie pe, do onSuccess, ale onSuccess jest zdefiniowany, aby wziąć Success<T>, a nie T . Musisz zmienić typ onSuccess:

     function fold<T>(
       onSuccess: (e: T) => void,
     // −−−−−−−−−−−−−−^
       onError: (a: XError) => void
     ): (pe: PossibleError<T>) => void {
       return pe => (isSuccessful(pe) ? onSuccess(pe.response) : onError(pe));
     }
    

    Link plac zabaw

    ... lub przekazać go pe:

     function fold<T>(
       onSuccess: (e: Success<T>) => void,
       onError: (a: XError) => void
     ): (pe: PossibleError<T>) => void {
       return pe => (isSuccessful(pe) ? onSuccess(pe) : onError(pe));
     // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^
     }
    

    Link plac zabaw


Strona Uwaga: W tych, zmieniłem Error do XError, więc nie jest to sprzeczne z funkcją standardowej {x2}}.

3
T.J. Crowder 28 lipiec 2020, 08:28