1. ホーム
  2. typescript

[解決済み] Typescript のプリミティブ型:"number" と "Number" の違い(TSC は大文字と小文字を区別しない)?

2022-09-13 21:58:11

質問

のパラメータを書きたいのですが 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]; 
    }
}

どのように解決するのですか?

JavaScriptには プリミティブ 型 (数値、文字列など) と オブジェクト 型(Number, String, etc., これらは実行時に明示される)がある。TypeScriptの型 numberNumber はそれぞれそれらを参照します。JavaScriptは通常、オブジェクトの型をそのプリミティブな等価物に強制するか、またはその逆を行います。

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

TypeScriptの型システムのルールでは、このような対処がなされています(仕様書3.7項)。

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