Typescriptプリミティブ型:「number」型と「Number」型の違い(TSCでは大文字と小文字は区別されません)?


91

タイプのパラメータを書くつもりでしたnumberが、タイプのつづりを間違えて、Number代わりに書きました。

私のIDE(JetBrains WebStorm)では、型Numberはプリミティブ型に使用されるのと同じ色で書かれていnumberますが、クラスの名前(既知または不明)を書くと異なる色を使用するので、どういうわけか認識していると思います正しい/ほぼ正しい/正しい種類のタイプとしてのスペルミスのタイプ。

コードをコンパイルすると、たとえばコンパイラがという名前のクラスが見つからなかったと文句を言う代わりにNumber、TSCは次のエラーメッセージを書き込みます。

Illegal property access

それはnumberNumber両方が異なるタイプとして共存することを意味しますか?

これが本当の場合、それらのクラスの違いはどれですか?

そうでない場合は、不明なクラスに対して表示されるのと同じエラーメッセージを単に書き込まなかったのはなぜですか(「名前「番号」は現在のスコープに存在しません」)

これはコードです:

class Test
{
    private myArray:string[] = ["Jack", "Jill", "John", "Joe", "Jeff"];

    // THIS WORKS
    public getValue(index:number):string
    {
        return this.myArray[index];
    }

    // THIS DOESN'T WORK: ILLEGAL PROPERTY ACCESS
    public getAnotherValue(index:Number):string
    {
        return this.myArray[index]; 
    }
}

回答:


57

JavaScriptには、プリミティブ型(数値、文字列など)とオブジェクト型(数値、文字列など、実行時にマニフェスト)の概念があります。TypeScriptタイプnumberNumberそれらをそれぞれ参照します。JavaScriptは通常、オブジェクトタイプをそのプリミティブに相当するものに強制します。その逆も同様です。

var x = new Number(34);
> undefined
x
> Number {}
x + 1
> 35

TypeScript型システムのルールはこれを次のように扱います(仕様セクション3.7)。

サブタイプ、スーパータイプ、および割り当ての互換性の関係を決定するために、Number、Boolean、およびStringプリミティブ型は、それぞれ「Number」、「Boolean」、および「String」インターフェースと同じプロパティを持つオブジェクト型として扱われます。


8
一つは、彼らがアサイン正確クロスではないことを追加される場合があります:typescriptlang.org/Playground/...
basarat

5
また、元のポスターに回答するには:はいTSC(javascriptなど)では大文字と小文字が区別されます:)
basarat 2013年

115

TypeScriptのすべきこととすべきでないことからのガイダンスでライアンの答えを補強するには:

しないでください今までのタイプを使用してNumberStringBooleanSymbol、またはObjectこれらのタイプは、ほとんどのJavaScriptコードで適切に使用されることはありません非プリミティブ箱入りのオブジェクトを参照してください。

/* WRONG */
function reverse(s: String): String;

ください種類を使用しnumberstringboolean、とsymbol

/* OK */
function reverse(s: string): string;

2
@atilkanそれは楽しいです。彼らは彼ら自身のアドバイスをしていないと思います。
Shaun Luttin 2018年

1
@RyanCavanaughこれを報告する必要があると思います。
localhoost 2018年

3
@ShaunLuttin配列については、小文字の例が見つかりません。
localhoost 2018年

3
@atilkanおそらく[]配列型を示すために使用する必要があります。例外があるかもしれませんが、よくわかりません。
ビクターザマニアン2018年

1
@VictorZamanianここに良い説明があります-> toddmotto.com/typing-arrays-typescript
localhoost

1

TypeScriptドキュメントが言うように:

var Number: NumberConstructor
(value?: any) => number

あらゆる種類の数を表すオブジェクト。すべてのJavaScript番号は64ビット浮動小数点数です。

それが言うようにany、パラメータとして取り、番号を返すか、null

値が数値かどうかを簡単に確認する方法を提供します

Number("1234");   // 1234
Number("1234.54") // 1234.54
Number("-1234.54") // -1234.54
Number("1234.54.33") // null
Number("any-non-numeric") // null

したがって、次のように、単純に番号を確認するために使用できます。

if(Number(val)){
   console.log('val is a number');
} else {
   console.log('Not a number');
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.