2016-04-08 16 views
2

içinde arıtma tanımaz: Aşağıdaki boş kontrol hata alır iseAkış Bu kod akışı kontrol geçer geri arama

/* @flow */ 

function test (list: ?Array<string>): Promise<number> { 
    if(list !== null && list !== undefined) { 
    return Promise.resolve(list.length) 
    } else { 
    return Promise.resolve(0) 
    } 
} 

console.log(test(null)) 

/* @flow */ 

function test (list: ?Array<string>): Promise<number> { 
    if(list !== null && list !== undefined) { 
    return Promise.resolve().then(() => list.length) 
    } else { 
    return Promise.resolve(0) 
    } 
} 

console.log(test(null)) 

hatası: Açıkça

property `length`. Property cannot be accessed on possibly null value 

liste null olamaz, bu nedenle kod yapısını akıcı hale getirecek bir şey olmalı bunu tanımak için.

Ne kadar kısıtladığımı ve nasıl çalışabileceğimi anlamak isterim. Teşekkürler!

cevap

5

Temel olarak, Akış, () => list.length yürütüldüğünde tür arıtma işleminizin (boş kontrol) gerçekleşeceğini bilmez. Bu geri dönüşün içinde Akış sadece listenin türüne bakar - ki bu boş olabilir.

Birinci ve ikinci snippet arasındaki fark, ikinci snippet list'un bir işlev sınırını geçmesidir - bu, türünü rafine ettiğinizden farklı bir işlevde kullanıyorsunuzdur.

Bir çözüm, bir değişkene list.length çıkarmak ve bu değişkeni geri aramada kullanmaktır.

var length = list.length; 
return Promise.resolve().then(() => length) 

Bu aynı zamanda çalışabilir: Bu sorun derhal geri aramalar, mesela çağrılan bile için var

var list2: Array<string> = list; 
return Promise.resolve().then(() => list2.length) 

Not olduğunu map veya forEach kullanırken. Bunun akışı hakkında bir sorun var, ama hızlı bir aramadan sonra bulamadım.

+0

Teşekkürler Nikita! Uyarılar bölümü burada ayrıntılı olarak açıklanmaktadır http://flowtype.org/docs/dynamic-type-tests.html#caveats – sorenbs