TypeScript พิมพ์การใช้อาร์เรย์


98

ฉันมีนิยามคลาส TypeScript ที่เริ่มต้นเช่นนี้

module Entities {          

    export class Person {
        private _name: string;
        private _possessions: Thing[];
        private _mostPrecious: Thing;

        constructor (name: string) {
            this._name = name;
            this._possessions = new Thing[100];
        }

ดูเหมือนอาร์เรย์ประเภท Thing จะไม่ได้รับการแปลอย่างถูกต้องเป็นประเภทอาร์เรย์ Javascript ที่สอดคล้องกัน นี่คือตัวอย่างจาก JavaScript ที่สร้างขึ้น:

function Person(name) {
    this._name = name;
    this._possessions = new Entities.Thing[100]();
}

การดำเนินการรหัสที่มีวัตถุบุคคลจะมีข้อยกเว้นเมื่อพยายามเริ่มต้นฟิลด์ _possession:

ข้อผิดพลาดคือ "0x800a138f - ข้อผิดพลาดรันไทม์ของ Microsoft JScript: ไม่สามารถรับค่าคุณสมบัติ '100': object is null or undefined"

ถ้าฉันเปลี่ยนประเภทของ _possession เป็นany[] และเริ่มต้น _possession ด้วยnew Array()ข้อยกเว้นจะไม่ถูกโยนทิ้ง ฉันพลาดอะไรไปหรือเปล่า?

คำตอบ:


122

คุณมีข้อผิดพลาดในไวยากรณ์ของคุณที่นี่:

this._possessions = new Thing[100]();

สิ่งนี้ไม่ได้สร้าง "อาร์เรย์ของสิ่งต่างๆ" ในการสร้างอาร์เรย์ของสิ่งต่างๆคุณสามารถใช้นิพจน์ตามตัวอักษรของอาร์เรย์:

this._possessions = [];

ของตัวสร้างอาร์เรย์หากคุณต้องการกำหนดความยาว:

this._possessions = new Array(100);

ผมได้สร้างตัวอย่างสั้น ๆ ทำงานคุณสามารถลองในสนามเด็กเล่น

module Entities {  

    class Thing {

    }        

    export class Person {
        private _name: string;
        private _possessions: Thing[];
        private _mostPrecious: Thing;

        constructor (name: string) {
            this._name = name;
            this._possessions = [];
            this._possessions.push(new Thing())
            this._possessions[100] = new Thing();
        }
    }
}

2
มันไม่ได้กำหนดความยาว แต่ควรจัดสรรอาร์เรย์ล่วงหน้า
Sebastian

ทำไมคุณถึงทำprivate _possessions: Thing[] : []; ในนิยามคลาสไม่ได้
SuperUberDuper

55

คุณสามารถลองทำอย่างใดอย่างหนึ่ง พวกเขาไม่ได้ให้ข้อผิดพลาดแก่ฉัน

นอกจากนี้ยังเป็นวิธีการที่แนะนำจากtypescript สำหรับการประกาศอาร์เรย์สำหรับการประกาศอาร์เรย์

โดยการใช้Array<Thing>มันเป็นการใช้ประโยชน์จาก generics ใน typescript คล้ายกับการขอList<T>รหัสใน c #

// Declare with default value
private _possessions: Array<Thing> = new Array<Thing>();
// or
private _possessions: Array<Thing> = [];
// or -> prefered by ts-lint
private _possessions: Thing[] = [];

หรือ

// declare
private _possessions: Array<Thing>;
// or -> preferd by ts-lint
private _possessions: Thing[];

constructor(){
    //assign
    this._possessions = new Array<Thing>();
    //or
    this._possessions = [];
}

3
เพื่อ preallocate new Array<Thing>(100)ขนาดการใช้งาน
Doug Domeny

1
คุณยังสามารถใช้ ... <Thing> []
danday74

@ danday74 - ฉันได้อัปเดตเพื่อรวมวิธีการของคุณซึ่งเป็นค่าเริ่มต้นเมื่อใช้ ts-lint ที่แนะนำ / config ล่าสุด
Kieran

9

แปลถูกต้องพิมพ์นิพจน์ไม่ได้ TypeScript พิมพ์นิพจน์new Thing[100]เป็นอาร์เรย์ไม่ถูกต้อง ควรเป็นข้อผิดพลาดในการทำดัชนีThingฟังก์ชันตัวสร้างโดยใช้ตัวดำเนินการดัชนี ใน C # สิ่งนี้จะจัดสรรอาร์เรย์ 100 องค์ประกอบ ใน JavaScript สิ่งนี้เรียกค่าที่ดัชนี 100 Thingราวกับว่าเป็นตัวสร้าง เนื่องจากค่าดังundefinedกล่าวทำให้เกิดข้อผิดพลาดที่คุณกล่าวถึง ใน JavaScript และ TypeScript คุณต้องการnew Array(100)แทน

คุณควรรายงานสิ่งนี้ว่าเป็นจุดบกพร่องบน CodePlex


1
ฉันไม่ต้องการ Array ใหม่ (100) ฉันต้องการอาร์เรย์ของ Thing ที่พิมพ์ ฉันไม่รู้ว่านี่เป็นข้อบกพร่องหรือเป็นเพียงการตีความข้อมูลจำเพาะของเอกสารผิด
Klaus Nji
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.