2016-07-20 8 views
2

これはSSCCEです。動的タイプのテストが期待通りに機能しない

私が呼び出される最初set方法と内部Mapをオンデマンドで作成されたマップコンテナクラスた:

// @flow 
'use strict'; 

class MapContainer { 

    map: ?Map<any, any>; 

    constructor() { 
     this.map=null; 
    } 

    set(key: any, value: any): ?any { 
     if (this.map===null) { 
      this.map = new Map(); 
     } 
     let prevValue: ?any; 
     if (this.map!=null) { // first check 
      prevValue = this.map.get(key); 
     } 
     if (this.map!=null) { // second check 
      this.map.set(key, value); 
     } 
     return prevValue; 
    } 
}  
exports.MapContainer = MapContainer; 

は、上記のコードは、警告なしでnpm run flowを通過します。

しかし私は1つに2つのif (this.map!=null)チェックをマージする場合:

// @flow 
'use strict'; 

class MapContainer { 

    map: ?Map<any, any>; 

    constructor() { 
     this.map=null; 
    } 

    set(key: any, value: any): ?any { 
     if (this.map===null) { 
      this.map = new Map(); 
     } 
     let prevValue: ?any; 
     if (this.map!=null) { // merged check 
      prevValue = this.map.get(key); 
      this.map.set(key, value); 
     } 
     return prevValue; 
    } 
}  
exports.MapContainer = MapContainer; 

&hellip;実行フローが失敗し、次のメッセージが表示されます。

es6/map-container.js:19 
19:     this.map.set(key, value); 
       ^^^^^^^^^^^^^^^^^^^^^^^^ call of method `set`. Method cannot be called on possibly null value 
19:     this.map.set(key, value); 
       ^^^^^^^^ null 

es6/map-container.js:19 
19:     this.map.set(key, value); 
       ^^^^^^^^^^^^^^^^^^^^^^^^ call of method `set`. Method cannot be called on possibly undefined value 
19:     this.map.set(key, value); 
       ^^^^^^^^ undefined 

&hellip;これはライン19上のアクセスとして全く意味がありません:

this.map.set(key,value)

&hellip;まだチェックで覆われている:

if (this.map!=null)

できますか?

答えて

1

getメソッドを呼び出すと、洗練が無効になることがあるという問題があります。 getの場合はどうなりますかthis.mapnull?流れは知る方法がないので、最悪の場合を想定しています。あなたができることは次のとおりです。

class MapContainer { 

    map: ?Map<any, any>; 

    constructor() { 
     this.map=null; 
    } 

    set(key: any, value: any): ?any {  
     if (!this.map) { 
      this.map = new Map(); 
     } 

     const map = this.map; 

     let prevValue: ?any; 
     if (this.map!=null) { 
      prevValue = map.get(key); 
      map.set(key, value); 
     } 
     return prevValue; 
    } 
}  
関連する問題