ค้นหาเว็บไซต์

การแคสต์ - มีความแตกต่างใดระหว่างการระบุชนิดและตัวดำเนินการ `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 ใหม่และตัวดำเนินการ as

TypeScript 1.6 แนะนำการใช้สกุลไฟล์ใหม่ .tsx สกุลไฟล์นี้มีประโยชน์สองประการ: มันทำให้ JSX สามารถใช้งานภายในไฟล์ TypeScript ได้ และทำให้ตัวดำเนินการใหม่ as เป็นวิธีมาตรฐานในการแปลงชนิดข้อมูล (เพื่อลดความกำกวมระหว่างนิพจน์ JSX กับตัวดำเนินการแปลงชนิดข้อมูลแบบพรีฟิกซ์ของ TypeScript) ตัวอย่างเช่น:

var x = <any> foo; 
// is equivalent to:
var x = foo as any;

บทความที่เกี่ยวข้อง