ประเภทในการทำลายโครงสร้างวัตถุ


124

นี้

const { foo: IFoo[] } = bar;

และนี่

const { foo: Array<IFoo> } = bar;

จะทำให้เกิดข้อผิดพลาดอย่างสมเหตุสมผล

และนี่

const { foo: TFoo } = bar;

จะทำลายโครงสร้างTFooทรัพย์สิน

สามารถระบุประเภทสำหรับคุณสมบัติของวัตถุที่ถูกทำลายได้อย่างไร


เป็นคำถามที่ดี แต่มันจะไม่สามารถอนุมานประเภทจากนิยามของคำจำกัดความได้barหรือไม่?

2
นี้ถูกปกคลุมค่อนข้างดีที่นี่

ความคิดเห็น @ user663031 ควรถูกลบเนื่องจากทำให้เข้าใจผิด
Sasuke Uchiha

@SasukeUchiha บทความนี้ไม่พร้อมใช้งาน แต่บทความส่วนใหญ่สามารถ googled ตามชื่อบทความได้ ย้ายไปที่mariusschulz.com/blog/… . มันทำให้แสงสว่างบางอย่างแน่นอน
Estus Flask

ที่เป็นประโยชน์ ขอบคุณ.
Sasuke Uchiha

คำตอบ:


192

ปรากฎว่าเป็นไปได้ที่จะระบุประเภทหลัง:สำหรับรูปแบบการทำลายล้างทั้งหมด:

const {foo}: {foo: IFoo[]} = bar;

ซึ่งในความเป็นจริงไม่ได้ดีไปกว่าของเก่าธรรมดา

const foo: IFoo[] = bar.foo;

2
แต่{foo}ไม่ได้เป็นมูลค่า เป็นสิ่งที่มักเรียกกันว่า "การแบ่งโครงสร้างการมอบหมายรูปแบบ" สิ่งที่คุณเห็นที่นี่เป็นคุณลักษณะพิเศษของ TypeScript ซึ่งอนุญาตให้เชื่อมโยงประเภทต่างๆกับรูปแบบดังกล่าว

อันที่จริงมันเหมือนกับกรณีพิเศษมากกว่าโดยเฉพาะอย่างยิ่งเมื่อเทียบกับlet x, y, z: stringที่ระบุประเภทไว้zเท่านั้น ฉันอัปเดตคำตอบแล้ว
artem

55

ฉันไปงานปาร์ตี้ช้าไปหน่อย แต่:

interface User {
  name: string;
  age: number;
}

const obj: any = { name: 'Johnny', age: 25 };
const { name, age }: User = obj;

ประเภทของคุณสมบัติnameและageควรอนุมานอย่างถูกต้องstringและnumberตามลำดับ


9
เป็นกรณีที่หายากเมื่อคุณต้องการใช้อินเทอร์เฟซสำหรับการทำลายล้างทุกครั้ง
RA.

2

ติดตามคำถามของฉันเอง

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

เมื่อพิจารณาว่าbarพิมพ์ถูกต้องfooประเภทจะถูกอนุมาน:

const bar = { foo: [fooValue], ... }; // bar type is { foo: IFoo[], ... }
...
const { foo } = bar; // foo type is IFoo[]

แม้ว่าจะbarพิมพ์ไม่ถูกต้อง ( anyหรือunknown) ก็สามารถยืนยันประเภทได้:

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