TypeScript veya JavaScript türü döküm


186

TypeScript veya Javascript'te tür dökümü nasıl yapılır?

Aşağıdaki TypeScript koduna sahip olduğumu varsayalım:

module Symbology { 

    export class SymbolFactory { 

        createStyle( symbolInfo : SymbolInfo) : any { 
            if (symbolInfo == null)
            {
                 return null;
            }

            if (symbolInfo.symbolShapeType === "marker") {      

                // how to cast to MarkerSymbolInfo          
                return this.createMarkerStyle((MarkerSymbolInfo) symbolInfo);
            }                                  
        }

        createMarkerStyle(markerSymbol : MarkerSymbolInfo ): any { 
            throw "createMarkerStyle not implemented";
        }              

    }
}

SymbolInfobir temel sınıf nerede . Nasıl dan typecasting hallediyorsunuz SymbolInfoiçin MarkerSymbolInfotypescript veya JavaScript?

Yanıtlar:


284

Şu şekilde yayınlayabilirsiniz:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

Veya tsx modu ile uyumlu olmak istiyorsanız şöyle:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

Bunun bir derleme zamanı kadrosu olduğunu ve bir çalışma zamanı kadrosu olmadığını unutmayın.


10
Şimdi, dokümanda, bölüm 4.13'te Tip Bildirimleri olarak anıldığını görüyorum.
Klaus Nji

Bu cevap artık daktiloda tip iddiasının tam resmini sunmazken, Alex'in cevabı daha eksiksiz bir resim verir ve kabul edilen cevap olmalıdır.
Kristoffer Dorph

@KristofferDorph Bu cevap 4 yaşında. Yazma sırasında, TypeScript 0.8.1 sürümündeydi ve bu nedenle o zaman doğru cevaptı. JSX desteği sadece 3 yıl sonra dahil edildi.
blorkfish

@blorkfish bu doğru, ama zamanları takip etmek iyi bir uygulamadır, bu yüzden bugün aynı soruyu soran insanlar 4 yıl önce olduğu gibi değil, şu anki cevabı alır :-)
Kristoffer Dorph

160

Buna TypeScript'te tür iddiası denir ve TypeScript 1.6'dan beri bunu ifade etmenin iki yolu vardır:

// Original syntax
var markerSymbolInfo = <MarkerSymbolInfo> symbolInfo;

// Newer additional syntax
var markerSymbolInfo = symbolInfo as MarkerSymbolInfo;

Her iki alternatif de işlevsel olarak aynıdır . Gündeme getirilmesinin nedeni as-Sözdizimi çeliştiğini orijinal sözdizimi olmasıdır JSX , tasarım tartışma bakınız burada .

Seçecek bir konumdaysanız, kendinizi daha rahat hissedeceğiniz sözdizimini kullanın. Ben şahsen as-syntax'ı okumayı ve yazmayı daha akıcı hissettiği için tercih ediyorum .


2
Bir nesneyi başka bir türe dönüştürdüğünüzde daktiloyu nasıl belirtirsiniz? Örneğin, type2 döndüren bir işlev, içinde http, tür 1 alır, dönüştürmek için mantık yapar ve type1 olanı döndürür ancak şimdi type2?
Tony Gutierrez

@TonyGutierrez Dönüştürmeyi nasıl yapıyorsunuz?
Alex

1
Temel olarak bir özellik al ve değiştir. Bunu yapmanın tek yolu yeni bir var (tip2) oluşturmak ve type1var'den sahne kopyalamak ve sonra geri dönmek. Tür1 ve dönüşü değiştiremezsiniz veya "Yayınlanamıyor" hatası alırsınız.
Tony Gutierrez

1

Daktiloda instanceofbir if deyiminde check-in yapmak mümkündür ve bu Typedözelliklerle aynı değişkene erişebilirsiniz .

Diyelim ki MarkerSymbolInfoüzerinde bir özellik var marker. Aşağıdakileri yapabilirsiniz:

if (symbolInfo instanceof MarkerSymbol) {
    // access .marker here
    const marker = symbolInfo.marker
}

Bir değişkeni, aynı değişkeni kullanarak, farklı bir değişken adına yeniden atamaya gerek kalmadan almanın iyi bir hilesi.

Daha fazla bilgi için bu iki kaynağa göz atın:

TypeScript örneği ve JavaScript örneği

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.