ฉันใช้รหัสต่อไปนี้เพื่อรับหมายเลขเฉพาะ:
let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3]
อย่างไรก็ตาม typescript รายงานข้อผิดพลาดต่อไปนี้: Type 'Set' ไม่ใช่ประเภทอาร์เรย์ ฉันไม่ใช่นินจานักพิมพ์มีใครบอกได้ไหมว่ามีอะไรผิดปกติที่นี่?
ฉันใช้รหัสต่อไปนี้เพื่อรับหมายเลขเฉพาะ:
let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3]
อย่างไรก็ตาม typescript รายงานข้อผิดพลาดต่อไปนี้: Type 'Set' ไม่ใช่ประเภทอาร์เรย์ ฉันไม่ใช่นินจานักพิมพ์มีใครบอกได้ไหมว่ามีอะไรผิดปกติที่นี่?
คำตอบ:
นี่คือคุณสมบัติที่ขาดหายไป TypeScript สนับสนุนเฉพาะการเล่นซ้ำบนอาร์เรย์ในขณะนี้
อัปเดต : ด้วย typescript 2.3 ตอนนี้คุณสามารถเพิ่ม"downlevelIteration": true
tsconfig ของคุณได้แล้วและจะใช้งานได้ในขณะที่กำหนดเป้าหมาย ES5
ข้อเสียdownlevelIteration
คือ TS จะต้องฉีดหม้อไอน้ำเล็กน้อยเมื่อทำการขนส่ง บรรทัดเดียวจากคำถามปรากฏขึ้นโดยมีแผ่นสำเร็จรูปเพิ่ม 21 บรรทัด: (ณ typescript 2.6.1)
แผ่นต้นแบบนี้จะถูกฉีดหนึ่งครั้งต่อไฟล์ที่ใช้การวนซ้ำแบบลดระดับและแผ่นสำเร็จรูปนี้สามารถลดลงได้โดยใช้"importHelpers"
ตัวเลือกผ่านทาง tsconfig (ดูบล็อกโพสต์นี้เกี่ยวกับการทำซ้ำระดับลงและimportHelpers
)
หรืออีกวิธีหนึ่งหากการสนับสนุน ES5 ไม่สำคัญสำหรับคุณคุณสามารถกำหนดเป้าหมายเป็น "es6" ได้ตลอดเวลาซึ่งในกรณีนี้โค้ดดั้งเดิมจะทำงานได้โดยไม่ต้องใช้แฟล็ก "downlevelIteration"
คำตอบเดิม:
สิ่งนี้ดูเหมือนจะเป็นมุมแหลมการถ่ายทอด ES6 แบบ typescript ตัว...
ดำเนินการควรทำงานกับทุกสิ่งที่มีคุณสมบัติตัววนซ้ำ (เข้าถึงโดยobj[Symbol.iterator]
) และชุดที่มีคุณสมบัตินั้น
การทำงานรอบนี้คุณสามารถใช้การแปลงชุดไปยังอาร์เรย์แรก:Array.from
...Array.from(new Set([1, 2, 3, 1, 1]))
Array.from
. คนอื่น ๆ ส่วนใหญ่ดูเหมือนจะยอมแพ้กับเรื่องนี้ ขอบคุณสำหรับการแก้ปัญหาที่แท้จริง!
es5
เป้าหมายเท่านั้น (ดูgithub.com/Microsoft/TypeScript/issues/4031 ) Array.from
ควรใช้งานได้ถ้าคุณมีes2015
หรือสูงกว่า ( es2017
, esnext
) ในlib
รายการของคุณใน tsconfig
คุณยังสามารถใช้เมธอด Array.from เพื่อแปลง Set เป็น Array
let uniques = Array.from(new Set([1, 2, 3, 1, 1])) ;
console.log(uniques);
Array.from()
คุณไม่จำเป็นต้องใช้ตัวดำเนินการกระจายอีกต่อไป มันเพิ่มค่าใช้จ่าย let uniques = Array.from(new Set([1, 2, 3, 1, 1]));
คุณต้องตั้งค่า"target": "es6",
ใน tsconfig ของคุณ
ใน Javascript:
[ ...new Set([1, 2, 3, 1, 1]) ]
ใน typescript:
Array.from(new Set([1, 2, 3, 1, 1]))
ใน React State (setState):
setCart(Array.from(new Set([...cart, {title: 'Sample', price: 20}])));
เพื่อให้ใช้งานได้คุณต้องมี "target": "ES6" (หรือสูงกว่า) หรือ "downlevelIteration": true ใน compilerOptions ของ tsconfig.json ของคุณ สิ่งนี้ช่วยแก้ปัญหาของฉันและทำงานได้ดีหรือฉันหวังว่ามันจะช่วยคุณได้