2017-07-08 6 views
3

コンパイラオプションstrictNullChecksが有効なTypescriptの動作を完全に理解できません。Typescript strictNullChecksと配列

interface MyMap { 
    [key: string]: string[]; 
} 

function f(myMap: MyMap) { 
    const keys = Object.keys(myMap); // keys: string[] => Fine. 
    for (let key of keys) { // key: string | undefined => Why? 
     key = key as string // So a cast is needed. 
     const strings = myMap[key]; // strings: string[] => Fine. 
     const s = strings[0]; // s: string => Fine. 

     // Error: 
     // Argument of type 'string | undefined' is not assignable to parameter of type 'string'. 
     // Type 'undefined' is not assignable to type 'string'. 
     useVarArgs(...strings); 
    } 
} 
function useVarArgs(...strings: string[]) { 
} 

アップデート2017年7月14日:

この奇妙な行動があることは時々活字体(バージョン2.4.1)はstring[]内の項目がstringあり、時にはそれがないことを理解しているようですdownlevelIterationを使用した場合にのみ観測されます。マイtsconfig.json

{ 
    "compilerOptions": { 
    "target": "es5", 
    "outDir": "target", 
    "downlevelIteration": true, 
    "strictNullChecks": true 
    } 
} 
+3

どのタイプのTypeScriptを使用していますか?コードは[TypeScript Playground](http://www.typescriptlang.org/play)で上手く見えます。 – Saravana

+0

申し訳ありませんが、私は言及を忘れてしまった。バージョン2.4.1。また編集された質問。 –

+1

私は2.4.1であなたのコードをテストし、正しく動作しています。 'key'はキャストする必要のある文字列であり、あなたが言及した問題はありません。 – unional

答えて

0

さらに調査した後、私は、これは活字体問題ではないことを確認することができます。問題の原因は、IteratorResult<T>に使用されるタイプです。私は@types/core-js 0.9.36を使用していました:the iterator protocolによると、valueがあるため

interface IteratorResult<T> { 
    done: boolean; 
    value?: T; 
} 

valueは、技術的に正しいである、オプションである「完了時に省略することができます本当です。」私の疑問が示すように、オプション性は実際には役に立たない。

:活字体( tsconfig.jsonで「LIB」セクションで構成されたとして「es2015」、すなわちファイル lib.es2015.iterable.d.ts)に同梱

種類は明らかにdonetrueときvalueが使用されないことを想定し、より実践的なアプローチを取ります

interface IteratorResult<T> { 
    done: boolean; 
    value: T; 
} 

問題を解決するには、@types/core-jsを編集するか、Typescriptに同梱されているライブラリに置き換えてください。交換は100%相当ではありません。this issueを参照してください。

関連する問題