2017-02-11 1 views
0

Недавно я применил Flow to my React Native project. До сих пор большинство вещей выполнимо.Вызов методов для объектов с нулевым значением в строке с проверкой типа потока

let player ?Object = new Player(); 
if (this.player) { 
    this.player.stop(); 
    this.player.destroy(); 
    this.player = null; 
} 

Однако Flow хочет, чтобы я сделал это, как показано ниже.

let player ?Object = new Player(); 
if (this.player) { 
    this.player.stop(); 
} 
if (this.player) { 
    this.player.destroy(); 
} 
this.player = null; 

Есть ли подходящий способ борьбы с подобным положением? Я не хочу использовать здесь подавляющий комментарий, потому что это не исключительный случай.

+0

https://flowtype.org/try/#0MYGwhgzhAEAK4E8CmAnA3gXwFCkjAgtGltNAA6KoBcA-NAPIBGAVksAC7QC80AdkgHc4lFAAoAlAG4S0ALYSiM0iCScKYZCm7R2ACwCWEAHTrN00qX0AzaKNOpxiixfsojEdgHsyE88-IiRgAmSB4ongi+Si4i2rwAriAgfqTYqVgYQA –

+1

'пусть игрок Object = новый игрок()' должен быть 'пусть игрок:? Object = новый игрок()' –

ответ

2

Поток пессимистично относится к уточнениям типа (например, нулевые проверки).

В вашем примере, поток не знает, является ли призыв к this.player.stop()this.player множеств к null или undefined. Из-за этого он должен предположить, что он может и делает недействительным уточнение.

Обычно я работаю вокруг этого, потянув свойства из в локальную переменную и работать на том, что:

let player ?Object = new Player(); 
const constPlayer = this.player; 
if (constPlayer) { 
    constPlayer.stop(); 
    constPlayer.destroy(); 
    this.player = null; 
} 

Это немного более многословным, но это не так плохо, как делать отдельную проверку NULL каждый раз.

За дополнительной информацией обращайтесь к разделу dynamic type tests caveats.

Смежные вопросы