2016-11-14 9 views
0

--strictNullChecksを有効にすると、tscは別の関数でチェックが行われるとオプションのプロパティが未定義でないと推測できないようです。 (私はこれを明確に表現するのに問題があるので、例を見てください)。Typescript strictNullChecks関数間でのチェック

//compiles 
function doStuff(foo: Foo) { 
    if (foo.bar === undefined) { 
     throw new Error("foo.bar must be defined"); 
    } 
    foo.bar.baz; 
} 

をそしてTSCはfoo.barを未定義にすることができると考えているので、このコードにはない:

//does not compile, foo.bar can be undefined 
function doStuff2(foo: Foo) { 
    validateFoo(foo); 
    foo.bar.baz; 
} 

function validateFoo(foo: Foo) { 
    if (foo.bar === undefined) { 
     throw new Error("foo.bar must be defined"); 
    } 
} 
次のコードはコンパイル

interface Foo { 
    bar?: { 
     baz: string; 
    }; 
} 

のようなオプションのプロパティとのインタフェースを考えると

これはなぜですか?定義されていないヌルをチェックできるものとして関数をマークする方法はありますか?可能であればfoo.bar!.bazを避けたいです。この例では、if/throwをインライン化するのは簡単ですが、Fooに複数のオプションのプロパティがある場合、複数の関数でチェックする必要があります。

+0

は、ここでは私のために働いているようだ - – gkb

+0

@gkbはjsfiddleに指定する方法がありますhttps://jsfiddle.net/of5ja33v/いますtscのバージョンが使用され、コンパイラフラグも使用されますか? strictNullChecksはデフォルトではfalseで、typescript 2.0+の場合のみです – martiansnoop

+0

申し訳ありませんが、tSc <2.0+の場合strictNullChecksで完全に逃しました。 – gkb

答えて

2

なぜですか?これは任意の深さに行くことができます -

あなたは活字体はあなたがvalidateFoo通話にもいることをすべての関数をインライン化する必要がある正確な結果を得るために、この機能をインライン化しようとしたが、その後に想像できます。

これについての実際の議論は、here on TypeScript's issue trackerです。

未定義とnullをチェックできるものとして関数をマークする方法はありますか?

のソート - 関数がtrueを返した場合どのようなパラメータの型活字体に伝える機能である型述語が、あります。次のように

function validateFoo(foo: Foo): foo is { bar: { baz: string } } { 
    if (foo.bar === undefined) { 
     throw new Error("foo.bar must be defined"); 
    } 
    return true; 
} 

あなたはそれを使用することができます:

function doStuff(foo: Foo) { 
    if (!validateFoo(foo)) { 
     throw foo; 
    } 
    foo.bar.baz; 
} 
関連する問題