Typecript ilkel türleri: "sayı" ve "Sayı" türleri arasında herhangi bir fark var mı (TSC büyük / küçük harf duyarlı mıdır)?


91

Bir tür parametresi yazmak numberistedim, ancak türü yanlış yazdım, Numberonun yerine yazdım .

IDE'mde (JetBrains WebStorm) tür Number, ilkel tür için kullanılanla aynı renkle numberyazılırken, bir sınıfın adını (bilinen veya bilinmeyen) yazarsam, farklı bir renk kullanır, bu yüzden bir şekilde tanıdığını tahmin ediyorum doğru / neredeyse doğru / doğru tür olarak yanlış yazılmış tür.

Kodu derlediğimde, örneğin derleyicinin adlı bir sınıf bulamadığından şikayet etmek yerine Number, TSC şu hata mesajını yazar:

Illegal property access

Bu, bu numberve Numberher ikisinin de farklı türler olarak birlikte var olduğu anlamına mı geliyor ?

Bu doğruysa, bu sınıflar arasındaki fark nedir?

Durum bu değilse, neden bilinmeyen sınıflar için görüntülediği aynı hata mesajını yazmadı ("'Sayı' adı mevcut kapsamda mevcut değil")

Kod bu:

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

Yanıtlar:


57

JavaScript, ilkel türler (sayı, dize vb.) Ve nesne türleri (Sayı, Dize vb. TypeScript türleri numberve Numberbunlara sırasıyla atıfta bulunun . JavaScript genellikle bir nesne türünü ilkel eşdeğerine zorlar veya bunun tersi de geçerlidir:

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

TypeScript türü sistem kuralları bununla (özellik bölümü 3.7) şu şekilde ilgilenir:

Alt tür, üst tür ve atama uyumluluk ilişkilerini belirlemek amacıyla, Sayı, Boole ve Dize ilkel türleri, sırasıyla "Sayı", "Boole" ve "Dize" arabirimleriyle aynı özelliklere sahip nesne türleri olarak ele alınır.


8
Bunların tam olarak çapraz atanabilir olmadıkları eklenebilir: typescriptlang.org/Playground/…
basarat

5
Ayrıca orijinal posteri yanıtlamak için: Evet TSC (javascript gibi) büyük / küçük harfe duyarlıdır :)
basarat

115

TypeScript Yapılması ve Yapılmaması Gerekenlerin rehberliğinde Ryan'ın yanıtını artırmak için :

Etmeyin hiç türlerini kullanmak Number, String, Boolean, Symbol, veya Objectbu tür neredeyse JavaScript kodu uygun şekilde hiç kullanılmamış olmayan ilkel kutulu nesnelere bakın.

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

Do türlerini kullanmak number, string, boolean, ve symbol.

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

2
@atilkan Bu eğlenceli. Sanırım kendi tavsiyelerini dinlemiyorlar.
Shaun Luttin

1
@RyanCavanaugh Sanırım bunu rapor etmeliyiz.
atilkan

3
@ShaunLuttin Peki ya dizi, küçük harfli bir örnek bulamıyorum.
atilkan

3
@atilkan Muhtemelen []dizi türlerini belirtmek için kullanmalısınız . Yine de istisnalar olabilir, emin değilim.
Victor Zamanian

1
@VictorZamanian Burada iyi bir açıklama var -> Toddmotto.com/typing-arrays-typescript
atilkan

1

TypeScript belgesinin dediği gibi:

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

Her türden bir sayıyı temsil eden bir nesne. Tüm JavaScript numaraları 64 bit kayan nokta sayılarıdır.

Dediği anygibi, parametre olarak alın ve numarayı döndürün veyanull

Bir değerin sayı olup olmadığını kontrol etmenin kolay bir yolunu sunar

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

Yani basitçe numarayı kontrol etmek için kullanabiliriz, örneğin:

if(Number(val)){
   console.log('val is a number');
} else {
   console.log('Not a number');
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.