Flow

2016-12-17 77 views
11

'daki birleşim türleri dizisine nesne dizisi atanamıyor Flow öğreniyorum ve bu yüzden JavaScript ve Flow ile küçük bir hobi projesi üzerinde çalışıyorum. Foo sınıfında ve nesnesinde yapıcıda bir seçenek olarak almak istediğim farklı bir sınıf Bar var. Bununla birlikte, her bir nesne için başka bir veri gönderebilmek istiyorum ve bu yüzden her öğenin düz Foo nesnesi veya bir dizi veya nesneye sarılmış Foo nesnesi olduğu bir diziye sahip olmak istiyorum. Ancak, bunun için kod yazmayı denediğimde, nedenini anlamadığım bazı garip hatalar aldım. Anlayabildiğim kadarıyla, bir tür çakışma olduğunu düşünüyor çünkü Foo, ile arasında birleşim türünün uyumlu olmadığını düşünüyor, ancak anladığım kadarıyla sadece bunlardan en az biriyle uyumlu olması gerekiyor. Ben şu hataları olsunFlow

// @flow 

class Foo { } 

interface BarOptions { 
    foos: (Foo | [ Foo ] | { foo: Foo })[];   // line 6 
} 

class Bar { 
    constructor(options?: BarOptions) { } 
} 

const foo: Foo = new Foo(); 

const bar = new Bar({ 
    foos: [ foo ],         // line 16 
}); 

: orada

Line 6: 
    tuple type: This type is incompatible with Foo 
    object type: This type is incompatible with Foo 
Line 16: 
    tuple type: This type is incompatible with Foo 
    object type: This type is incompatible with Foo 

mı ...

Burada aldığım kesin hataları yeniden üretmek için gereken minimum kodu (link to tryflow.org example) var Bu hatalar için sezgisel (ya da olmayan) bir neden?

cevap

2

BarOptions'un aslında bir arabirim yerine tür takma adı olması gerektiğini düşünüyorum. Bir arayüz declares a type that classes can implement. Arabirimler veri türleri değildir ve alanlara sahip olmamalıdır (veri içerir).

interface BarOptions'u type BarOptions = olarak değiştirirsek her şey çalışır.

interface BarOptions { 
    foos(): (Foo | [ Foo ] | { foo: Foo })[]; 
} 
2

bunu bu açık Github ticket ile ilgili olabilecek düşünüyor musunuz:

Alternatif bir alıcı fonksiyonu haline foo değiştirebilirim? Biz type ile interface yerine, bu doğrular:

// @flow 

class Foo { } 

type BarOptions ={ 
    foos: 
     Class<Foo> | 
     Foo | 
     Foo[] | 
     { foo: Foo } 
} 

class Bar { 
    constructor(options?: BarOptions) { } 
} 

const foo: Foo = new Foo(); 

const bar = new Bar({ 
    foos: Foo, 
// foos: foo, 
// foos: [foo], 
// foos: { foo: foo }, 
}); 
+0

bu işe yarar açıklayabilir misiniz? (Benim sorununun nasıl düzeltileceği değil, ilk etapta bunun neden bir sorun olduğunu anlamaya çalışıyor) – Frxstrem

+0

İkisinin nasıl farklı olduğunu göremiyorum; Bunu anladığım gibi, her iki durumda da foo'nun aynı tür (Foo) ile beyan edileceği tek fark, ilk satırınızda türün açık olması, ikincide ise açık olmasıdır. Akış türlerinin nasıl çalıştığını yanlış anlamış olmadıkça, bunların nasıl farklı davrandıklarını göremiyorum (aslında öyle görünüyorlar). – Frxstrem

+0

Bu sorun bununla ilgili olabilir mi? https://github.com/facebook/flow/issues/1569 –