การแคสต์ - มีความแตกต่างใดระหว่างการระบุชนิดและตัวดำเนินการ `as` ใหม่ใน TypeScript หรือไม่?
มีความแตกต่างอะไรไหมระหว่างสิ่งที่ข้อกำหนดของ TypeScript เรียกว่า type assertion:
var circle = <Circle> createShape("circle");
และตัวดำเนินการ as รุ่นใหม่:
var circle = createShape("circle") as Circle;
ทั้งสองอย่างมักถูกใช้สำหรับการแปลงประเภทในขณะคอมไพล์
คำตอบ #1
ความแตกต่างคือ as Circle ใช้งานได้ในไฟล์ TSX แต่ <Circle> ขัดแย้งกับไวยากรณ์ JSX as ถูกนำมาใช้ด้วยเหตุผลนี้
ตัวอย่างเช่น โค้ดด้านล่างนี้ในไฟล์ .tsx:
var circle = <Circle> createShape("circle");
จะส่งผลให้เกิดข้อผิดพลาดดังต่อไปนี้:
ข้อผิดพลาด TS17002: คาดว่าจะมีแท็กปิด JSX ที่ตรงกันสำหรับ 'Circle'
อย่างไรก็ตาม as Circle จะทำงานได้ดีเช่นกัน
ใช้ as Circle จากนี้ไป นี่คือไวยากรณ์ที่แนะนำ
คำตอบ #2
จากหน้าวิกิพีเดีย: "มีอะไรใหม่ใน TypeScript [1.6]":
นามสกุลไฟล์
.tsxใหม่และตัวดำเนินการasTypeScript 1.6 แนะนำการใช้สกุลไฟล์ใหม่
.tsxสกุลไฟล์นี้มีประโยชน์สองประการ: มันทำให้ JSX สามารถใช้งานภายในไฟล์ TypeScript ได้ และทำให้ตัวดำเนินการใหม่asเป็นวิธีมาตรฐานในการแปลงชนิดข้อมูล (เพื่อลดความกำกวมระหว่างนิพจน์ JSX กับตัวดำเนินการแปลงชนิดข้อมูลแบบพรีฟิกซ์ของ TypeScript) ตัวอย่างเช่น:var x = <any> foo; // is equivalent to: var x = foo as any;
