2017-07-04 8 views
0

共用体戻り型の(比較)関数があります。 -1,1または0を返すことができます。しかし、比較される項目の少なくとも1つが定義されていない場合には、特別なケース(結果)が必要です。コンパイラはnullを潜在的な戻り値として追加することができますが、NaN(いくつかのシナリオでは、数値や日付の比較など)を返すことはできません。有効な戻り値としてNaNを持つ整数(リテラル)共用体型

これは

function myFunc(item1: MyType, item2: MyType): -1 | 0 | 1 | null { 
    ... 
} 

をコンパイルしますが、この1のために、コンパイラは、それが "名前はNaNを見つけることができません" と言う:

function myFunc(item1: MyType, item2: MyType): -1 | 0 | 1 | NaN { 
    ... 
} 

はなぜNaN許可されていませんか? NaNを使用する方法はありますか?

+0

NaNは浮動小数点型ではありません。それはおそらくTSがそれを好まない理由です。 – mfeineis

+0

@mfeineは確かですが、この 'function bla():1 | "3" | null {...} 'もコンパイルされます。 –

+0

JavaScriptはintとfloatの違いはありません。どちらも同じ型の 'Number'です。私はNaNも 'Number 'だと思います。 – Misaz

答えて

2

NaNそれ自体はタイプではなく、タイプの値Numberです。したがって、NaN型のものとして何かを定義する方法はありません。

数値のリテラルタイプはすべて単一の値なので、意味があります。 -1、またはリテラル値の和集合1 | 0 | -1では、NaNは単一の値ではありません。なぜなら、NaNは他の値と等しく比較されることはありません。事実上、無限の値のセットです。

NaNを使用して関数から特定の結果を示すことは、その結果を得るためにテストできる唯一の方法が別の関数を呼び出すことであることを示唆しています。戻り値の型にnullまたはundefinedを追加したほうがよいでしょう(またはリテラル文字列が気に入らない場合)。

let foo = NaN; 
switch(foo) { 
    case 1: console.log('got 1'); break 
    case NaN: console.log('got NaN'); break; 
    default: console.log('other'); 
} 

が出力されます 'その他':

ことに注意してください。

function myFunc(item1: MyType, item2: MyType): -1 | 0 | 1 | 'not comparable' { 
    ... 
} 

をして、あなただけの「比較できない」に対する結果を比較することができます:

だから、ちょうどこれを行うことができます。

+0

関数のスコープを脇に置いてください(これは実際の問題ではなく、例であり、 'null'を使用して終了しました)。実際には、すべての値( '-1'、' 0'、 '1''と' 'NaN'')を定数とみなすことができます。これは、特定の値のセットの中から1つの(一定の)値を返すことができる関数を持っていることを意味します。 TSコンパイラは同意しません... –

+0

はい、しかし、私の指摘は、NaNは単一の値ではなく、むしろ値のクラスであるということです。 – Duncan

1

1とは異なり、NaNは、literal type(つまり、そのリテラル値のみを含むタイプ)として使用することはできません。

const n1 = 1, n2 = NaN; 
typeof n1; // 1 
typeof n2; // number 

我々はまた、戻り値の型としてnumberを使用することができますが、これは-2のようなより多くの戻り値を可能にします。オプションを制限したい場合は、nullが私によく見えます。

関連する問題