การคัดเลือกประเภท TypeScript หรือ JavaScript


185

วิธีจัดการกับการคัดเลือกนักแสดงใน TypeScript หรือ Javascript อย่างไร

ว่าฉันมีรหัส TypeScript ต่อไปนี้:

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

    }
}

อยู่ที่ไหนSymbolInfoชั้นฐาน ฉันจะจัดการ typecasting จากSymbolInfoเป็นMarkerSymbolInfoใน TypeScript หรือ Javascript ได้อย่างไร

คำตอบ:


284

คุณสามารถหล่อแบบนี้:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

หรืออย่างนี้ถ้าคุณต้องการที่จะเข้ากันได้กับโหมด tsx:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

เพียงจำไว้ว่านี่คือการคอมไพล์เวลารวบรวมไม่ใช่การร่ายแบบรันไทม์


10
ตอนนี้ฉันเห็นว่าในเอกสารอ้างอิงถึงการยืนยันประเภทในหัวข้อ 4.13
Klaus Nji

คำตอบนี้ไม่ได้ให้ภาพเต็มของการยืนยันประเภทใน typescript ในขณะที่คำตอบของ Alex ให้ภาพที่สมบูรณ์มากขึ้นและควรเป็นคำตอบที่ได้รับการยอมรับ
Kristoffer Dorph

@KristofferDorph คำตอบนี้มีอายุ 4 ปี ในช่วงเวลาของการเขียน TypeScript เป็นรุ่น 0.8.1 และดังนั้นจึงเป็นคำตอบที่ถูกต้องในเวลานั้น การสนับสนุน JSX นั้นรวม 3 ปีต่อมา
blorkfish

@blorkfish ที่เป็นความจริง แต่เป็นวิธีปฏิบัติที่ดีในการติดตามเวลาดังนั้นผู้คนที่ถามคำถามเดียวกันในวันนี้จะได้รับคำตอบในปัจจุบันไม่ใช่อย่างที่ 4 ปีก่อน :-)
Kristoffer Dorph

160

สิ่งนี้เรียกว่าการยืนยันประเภทใน TypeScript และตั้งแต่ TypeScript 1.6 มีสองวิธีในการแสดงสิ่งนี้:

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

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

ทางเลือกทั้งสองมีหน้าที่เหมือนกัน เหตุผลสำหรับการแนะนำการas-syntax คือไวยากรณ์เดิมขัดแย้งกับJSX , ดูการอภิปรายการออกแบบที่นี่

หากคุณอยู่ในตำแหน่งที่จะเลือกเพียงแค่ใช้ไวยากรณ์ที่คุณรู้สึกสะดวกสบายกับ ฉันชอบasไวยากรณ์ - ส่วนตัวมากกว่าเพราะรู้สึกคล่องในการอ่านและเขียน


2
คุณระบุถึง typescript ที่คุณแปลงวัตถุเป็นประเภทอื่นได้อย่างไร ตัวอย่างเช่น func ที่คืนค่า type2 ภายในนั้น http รับประเภท 1 ตรรกะในการแปลงและส่งคืนชนิดที่ 1 แต่ตอนนี้เป็น type2 หรือไม่
Tony Gutierrez

@TonyGutierrez คุณจะทำการแปลงอย่างไร
อเล็กซ์

1
โดยทั่วไปจะใช้สถานที่ให้บริการหนึ่งและปรับเปลี่ยน วิธีเดียวที่ฉันได้พบการทำเช่นนี้คือการสร้าง var ใหม่ (type2) และคัดลอกในอุปกรณ์ประกอบฉากจาก type1var แล้วส่งคืน คุณไม่สามารถแก้ไข type1 และส่งคืนได้หรือคุณได้รับข้อผิดพลาด "ไม่สามารถส่งได้"
Tony Gutierrez

1

ใน typescript มันเป็นไปได้ที่จะทำการinstanceofตรวจสอบในคำสั่ง if และคุณจะสามารถเข้าถึงตัวแปรเดียวกันกับTypedคุณสมบัติ

ดังนั้นสมมติว่ามีคุณสมบัติที่มันเรียกว่าMarkerSymbolInfo markerคุณสามารถทำสิ่งต่อไปนี้:

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

มันเป็นเคล็ดลับเล็กน้อยที่ดีในการรับอินสแตนซ์ของตัวแปรโดยใช้ตัวแปรเดียวกันโดยไม่จำเป็นต้องกำหนดใหม่ให้กับชื่อตัวแปรอื่น

ตรวจสอบแหล่งข้อมูลทั้งสองนี้สำหรับข้อมูลเพิ่มเติม:

อินสแตนซ์ของ TypeScriptและ JavaScript ของอินสแตนซ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.