2017-03-10 20 views
5

Tại sao null-kiểm tra thất bại trong func1 trong khi nó là ok trong func2FlowType: null kiểm tra thất bại

/* @flow */ 

const func1 = (arr?: Array<*>) => { 
    const isArrayNotEmpty = arr && arr.length; 

    if (isArrayNotEmpty) { 
    arr.forEach((element) => console.log(element)); 
    } 
} 

const func2 = (arr?: Array<*>) => { 
    if (arr && arr.length) { 
    arr.forEach((element) => console.log(element)); 
    } 
} 

Live example

Trả lời

3

Tôi không biết lý do tại sao luồng không hỗ trợ này, nhưng không. Hiện tại, yêu cầu kiểm tra các loại sàng lọc thực sự xảy ra trong câu lệnh if và không theo dõi chúng nếu chúng được trừu tượng hóa thành một biến riêng biệt.

Có một thay thế có thể chấp nhận được đối với bạn (Tôi không chắc đó là tài liệu bất cứ nơi nào):

/* @flow */ 

const func1 = (arr?: Array<*>) => { 
    if (isArrayNotEmpty(arr)) { 
    arr.forEach((element) => console.log(element)); 
    } 
} 

function isArrayNotEmpty(x: mixed): %checks { 
    return x && x.length; 
} 

(tryflow)

Các đặc %checks kiểu trả về chỉ để dòng chảy mà nó nên nhìn vào phần thân của hàm để tìm hiểu ý nghĩa của nó về các loại biến được truyền. Tôi tin rằng có một số hạn chế về những gì có thể ở trong cơ thể của một chức năng như vậy. Nó thậm chí có thể là trường hợp nó chỉ phải trả lại một biểu thức duy nhất. Điều này sẽ cung cấp cho bạn đủ để thử nghiệm với nó, mặc dù.

Các vấn đề liên quan