TypeScript atau tipe JavaScript casting

185

Bagaimana cara menangani casting tipe dalam TypeScript atau Javascript?

Katakanlah saya memiliki kode TypeScript berikut:

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

    }
}

dimana SymbolInfokelas dasar. Bagaimana cara menangani typecasting dari SymbolInfoke MarkerSymbolInfodalam TypeScript atau Javascript?

Klaus Nji
sumber

Jawaban:

284

Anda dapat melakukan seperti ini:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

Atau seperti ini jika Anda ingin kompatibel dengan mode tsx:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

Hanya ingat bahwa ini adalah waktu kompilasi, dan bukan cast runtime.

blorkfish
sumber
10
Sekarang, saya melihat bahwa di dalam dokumen, disebut sebagai Ketegasan Jenis di bagian 4.13.
Klaus Nji
Jawaban ini tidak lagi memberikan gambaran lengkap tentang pernyataan jenis dalam naskah, sedangkan jawaban Alex memberikan gambaran yang lebih lengkap, dan harus menjadi jawaban yang diterima.
Kristoffer Dorph
@KristofferDorph Jawaban ini adalah 4 tahun. Pada saat penulisan TypeScript berada di versi 0.8.1, dan dengan demikian adalah jawaban yang benar pada saat itu. Dukungan BEJ hanya dimasukkan 3 tahun kemudian.
blorkfish
@blorkfish itu benar, tetapi ini adalah praktik yang baik untuk mengikuti perkembangan zaman, jadi orang yang menanyakan pertanyaan yang sama hari ini mendapatkan jawaban saat ini, dan tidak seperti di mana 4 tahun lalu :-)
Kristoffer Dorph
160

Ini disebut tipe pernyataan dalam TypeScript, dan sejak TypeScript 1.6, ada dua cara untuk mengekspresikan ini:

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

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

Kedua alternatif itu identik secara fungsional . Alasan untuk memperkenalkan as-syntax adalah bahwa sintaks aslinya bertentangan dengan JSX , lihat diskusi desain di sini .

Jika Anda berada dalam posisi untuk memilih, gunakan saja sintaksis yang Anda rasa lebih nyaman. Saya pribadi lebih suka as-syntax karena rasanya lebih lancar membaca dan menulis.

Alex
sumber
2
Bagaimana Anda menunjukkan ke naskah bahwa Anda telah mengonversi objek ke jenis lain? Misalnya func yang mengembalikan type2, di dalamnya http mendapat tipe 1, apakah logika untuk mengkonversi, dan mengembalikan apa yang type1 tetapi sekarang type2?
Tony Gutierrez
@TonyGutierrez Bagaimana Anda melakukan konversi?
Alex
1
Pada dasarnya ambil satu properti dan modifikasi. Satu-satunya cara yang saya temukan untuk melakukan ini adalah dengan membuat var baru (type2) dan menyalin props dari type1var dan kemudian mengembalikannya. Anda tidak dapat mengubah type1 dan kembali, atau Anda mendapatkan kesalahan "Tidak bisa melempar".
Tony Gutierrez
1

Dalam naskah, dimungkinkan untuk melakukan instanceofpemeriksaan dalam pernyataan if dan Anda akan memiliki akses ke variabel yang sama dengan Typedproperti.

Jadi katakanlah MarkerSymbolInfomemiliki properti yang disebutnya marker. Anda dapat melakukan hal berikut:

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

Ini adalah trik kecil yang menyenangkan untuk mendapatkan instance dari variabel menggunakan variabel yang sama tanpa perlu menugaskannya kembali ke nama variabel yang berbeda.

Lihat dua sumber ini untuk informasi lebih lanjut:

Ketik instanceScript & instance JavaScript dari

Pengembang Newteq
sumber