TypeScript: การสร้างอาร์เรย์คอนเทนเนอร์ที่พิมพ์ว่างเปล่า


185

ฉันกำลังสร้างเกมตรรกะง่ายๆที่ชื่อว่า "Three of a Crime" ใน TypeScript

เมื่อพยายามจัดสรรอาเรย์แบบพิมพ์ล่วงหน้าใน TypeScript ฉันพยายามทำสิ่งนี้:

var arr = Criminal[];

ซึ่งทำให้เกิดข้อผิดพลาด "ตรวจสอบรูปแบบของคำที่แสดงออก"

ลองทำสิ่งนี้

var arr : Criminal = [];

และสิ่งนี้ผลิต "ไม่สามารถแปลง [] ใด ๆ เป็น 'อาชญากร'

เป็น 'TypeScript' วิธีทำเช่นนี้?

คำตอบ:


169

คำตอบที่มีอยู่พลาดตัวเลือกดังนั้นนี่คือรายการทั้งหมด:

// 1. Explicitly declare the type
var arr: Criminal[] = [];

// 2. Via type assertion
var arr = <Criminal[]>[];
var arr = [] as Criminal[];

// 3. Using the Array constructor
var arr = new Array<Criminal>();
  1. การระบุประเภทอย่างชัดเจนเป็นโซลูชันทั่วไปสำหรับเมื่อใดก็ตามที่การอนุมานประเภทล้มเหลวในการประกาศตัวแปร

  2. ข้อดีของการใช้การยืนยันประเภท (บางครั้งเรียกว่านักแสดง แต่มันไม่ใช่นักแสดงใน TypeScript) ใช้ได้กับนิพจน์ใด ๆ ดังนั้นจึงสามารถใช้งานได้แม้ว่าจะไม่มีการประกาศตัวแปรก็ตาม มีไวยากรณ์สองแบบสำหรับการยืนยันประเภท แต่เฉพาะหลังจะทำงานร่วมกับ JSX ได้หากคุณสนใจ

  3. การใช้ตัวสร้าง Array เป็นสิ่งที่จะช่วยคุณในกรณีการใช้งานเฉพาะนี้เท่านั้น อย่างไรก็ตามมีผลกระทบต่อประสิทธิภาพเล็กน้อยที่รันไทม์ * นอกจากนี้หากมีคนบ้าพอที่จะกำหนดตัวสร้างอาร์เรย์ความหมายอาจเปลี่ยนแปลงได้

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

*: สนุกจริงๆ; ในขณะที่เขียนความแตกต่างด้านประสิทธิภาพเป็น 60% ใน Chrome ในขณะที่ Firefox ไม่มีความแตกต่างของประสิทธิภาพที่วัดได้


60% ?? : O เป็นเรื่องป่า
Max Coplan

239

ปัญหาของการจัดสรรอาเรย์ที่ถูกพิมพ์ล่วงหน้าอย่างถูกต้องใน TypeScript ค่อนข้างถูกบดบังเนื่องจากไวยากรณ์ของตัวอักษรอาเรย์ดังนั้นมันจึงไม่ง่ายเท่าที่ฉันคิด

วิธีที่ถูกต้องก็คือ

var arr : Criminal[] = [];

สิ่งนี้จะทำให้คุณพิมพ์อาเรย์เปล่าที่ถูกต้องและเก็บไว้ในตัวแปร 'arr'

หวังว่านี่จะช่วยผู้อื่น!


20

ฉันรู้ว่านี่เป็นคำถามเก่า แต่เมื่อเร็ว ๆ นี้ฉันพบปัญหาที่คล้ายกันซึ่งไม่สามารถแก้ไขได้ด้วยวิธีนี้เนื่องจากฉันต้องส่งคืนอาร์เรย์ที่ว่างเปล่าของประเภทเฉพาะ

ฉันมี

return [];

ที่[]เป็นCriminal[]ประเภท

ทั้งreturn: Criminal[] [];มิได้return []: Criminal[];ทำงานให้ฉัน

ตอนแรกฉันแก้ไขมันโดยการสร้างตัวแปรที่พิมพ์ (ตามที่คุณรายงานอย่างถูกต้อง) ก่อนที่จะส่งคืน แต่ (ฉันไม่รู้ว่า JavaScript ทำงานอย่างไร) มันอาจสร้างโอเวอร์เฮดและสามารถอ่านได้น้อยกว่า

สำหรับความละเอียดถี่ถ้วนฉันจะรายงานวิธีแก้ปัญหานี้ในคำตอบของฉันด้วย:

let temp: Criminal[] = [];
return temp;

ในที่สุดฉันก็พบว่าการพิมพ์ TypeScript ซึ่งทำให้ฉันสามารถแก้ปัญหาด้วยวิธีที่กระชับและอ่านง่ายขึ้น (และอาจมีประสิทธิภาพ):

return <Criminal[]>[];

หวังว่านี่จะช่วยผู้อ่านในอนาคต!


1

สำหรับการเข้าถึงแบบสาธารณะใช้งานด้านล่าง:

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