web-dev-qa-db-ja.com

タイプスクリプトのプリミティブ型:タイプ「番号」と「番号」の違い(TSCは大文字と小文字を区別しません)

タイプnumberのパラメーターを記述するつもりでしたが、タイプのスペルを間違え、代わりにNumberを記述しました。

私のIDE(JetBrains WebStorm)では、タイプNumberは、プリミティブタイプnumberに使用されるのと同じ色で書き込まれます。クラス(既知または未知)の異なる色を使用しているため、スペルミスタイプを正しい/ほぼ正しい/正しく並べ替えたタイプとして何らかの形で認識していると思います。

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

Illegal property access

numberNumberの両方が異なるタイプとして共存するということですか?

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

そうでない場合は、未知のクラスに対して表示されるのと同じエラーメッセージを単に記述しなかった理由(「名前 'Number'は現在のスコープに存在しません」)

これはコードです:

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]; 
    }
}
68
Cesco

JavaScriptの概念は、プリミティブタイプ(数値、ストリングなど)およびオブジェクトタイプ(実行時にマニフェストである数値、ストリングなど)です。 TypeScriptタイプnumberおよびNumberはそれぞれそれらを参照します。 JavaScriptは通常、オブジェクトタイプをそのプリミティブな同等のものに強制します。

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

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

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

40
Ryan Cavanaugh

TypeScriptの推奨事項と禁止事項 からのガイダンスでRyanの回答を補強するには:

使用しないでくださいNumberStringBooleanSymbol、またはObjectこれらの型は、JavaScriptコードで適切に使用されることはほとんどない非プリミティブボックスオブジェクトを参照します。

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

Doタイプnumberstringboolean、およびsymbolを使用します。

/* OK */
function reverse(s: string): string;
79
Shaun Luttin