2017-02-23 48 views
12

Jak sprawdzić poprawność kształtu struktury danych Immutable.JS wygenerowanej z fromJS przy użyciu funkcji Flow? Plain Old plamy JS może być wpisany bardzo dokładnie przy użyciu obiektu dosłownego zapisu:Przepływ: Typechecking złożony niezmienny kształt przy użyciu fromJS()?

type ObjectShape = { 
    a: number, 
    b: string, 
    c: { 
    d: number, 
    }, 
    e: Array<number> 
}; 

const obj: ObjectShape = { // hyper-accurate 
    a: 1, 
    b: '2', 
    c: { 
    d: 3, 
    }, 
    e: [4] 
} 

Jednak na stronie Immutable.js, nie wydają się być dwie główne komplikacje:

  1. Wydaje się, że Niezmienne fromJS metoda js wraca any (https://github.com/facebook/immutable-js/blob/master/type-definitions/immutable.js.flow#L764), więc po nie zostanie złapany jako błąd przepływu:

    const map: boolean = fromJS(obj) // this is totally not true, but Flow can't tell 
    
  2. Wygląda na to, że kształty map nie mogą być opisane za pomocą notacji podobnej do obiektu na How to describe Immutable.js Map shape with Flow (lub czy ta informacja jest nieaktualna?).

Jestem autentycznie zdezorientowany, jak przekonać Flow do zrozumienia Immutable.js, w szczególności map. Z tego co wiem, Flow traci dużo inteligencji na temat kodu, gdy dane żyją w strukturach Immutable.js zamiast zwykłych prymitywów JS.

+0

co z https://github.com/flowtype/flow-typed, można po prostu załadować definicję typu mapy –

+0

Nie ma definicji dla immutabe.js na typie przepływu, są one zawarte bezpośrednio z immutable.js pakiet od npm. Jednak definicja Mapa dołączona immutable.js teraz nie wydaje się aby zdefiniować kształt: https://github.com/facebook/immutable-js/blob/master/type-definitions/immutable.js.flow# L489 –

Odpowiedz

0

Można by teoretycznie musiał użyć Record(), które zakodowane oczekiwany kształt i następnie dodać typechecking ...

Tyle że statycznie wpisując rzeczywistej członkach tego niezmienna-js struktury będzie niestety nie być możliwe, ponieważ certainfeatures które nie mają przepływu.

Istnieje obecnie kilka żądań pobrania (first, second), aby dodać niezbędne funkcje do typechecker, ale są one dość zaangażowane, a proces ich przeglądania i integracji wydaje się być wewnętrznie na Facebooku.

Podejrzewam, że jak tylko zostaną scalone, definicje typu flow, które zakodują nową gorliwość, będą niemal natychmiastowe, nawet jeśli projekt immutable-js nie integruje ich tak szybko.

Uwaga: Jeśli chcesz wyrazić opinię, proszę nie zostawiaj „+1” lub „kiedy to się robi uwag”; nie są one akceptowane w tym repozytorium. Zamiast tego użyj funkcji reakcji/głosowania.

+1

Widzę, że PR-y są teraz zamknięte. Każdy przykład, jak to zrobić, jeśli jest to możliwe teraz? –

+1

Zamiast tych PR-ów rozwiązaniem, do którego dotarli ludzie flow, było dodanie funkcji * new * type, $ ElementType, która ma niezbędne funkcje. Zobacz np. https://flow.org/try/#0C4TwDgpgBA0hJQLxQOQGt4oNwChSSgBUkoBvKDEALigDsBXAWwCMIAnKAX1wBMIBjADYBDNtABuoqGDYB7MDQAkAUUERGEWsELgIAHkIAaOCAB8uIA – azernik