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

การนิยามตัวแปรท้องถิ่นใหม่ใน TypeScript


มีเหตุผลเฉพาะอะไรหรือไม่ที่คอมไพเลอร์ TypeScript ไม่ทำเครื่องหมายกรณีต่อไปนี้ว่าเป็นข้อผิดพลาด?

myFunction(len: number) {
    var len: number = 5;     // re-definition of local variable (name clash)
}

อีกอันหนึ่ง:

myFunction() {
    var b: number = a;       // variable a is accessed before it is declared/initialized
    var a: number = 5;
}

ฉันเคยเจอสถานการณ์ทั้งสองอย่างอย่างน้อยสองครั้งเมื่อแปลงจาก Javascript เป็น TypeScript คงช่วยประหยัดเวลาการดีบักได้หลายชั่วโมงถ้าตัวคอมไพเลอร์เตือนฉัน

TypeScript 0.9.5

แก้ไข: นี่คือตัวอย่างของ TypeScript ที่ไม่ถูกต้องบางส่วนที่คอมไพเลอร์ TypeScript คอมไพล์เป็น JavaScript ที่ถูกต้อง:

class MyClass {
    myFunction(myParam: number) {
        myParam = 'abc';
    }
}

ถ้าฉันบันทึกสิ่งนี้ใน Visual Studio TypeScript จะมองว่าเป็นข้อผิดพลาด แต่ยังคงคอมไพล์ไปเป็น

var MyClass = (function () {
    function MyClass() {
    }
    MyClass.prototype.myFunction = function (myParam) {
        myParam = 'abc';
    };
    return MyClass;
})();

ฉันเจอสถานการณ์แบบนี้ทุกวัน

แก้ไข 2: คำขอถูกยื่นแล้ว: https://typescript.codeplex.com/workitem/2128

คำตอบ #1

แม้ว่าจะสับสน แต่ทั้งสองกรณีนี้ไม่ถือเป็นข้อผิดพลาดตามข้อกำหนดของ EcmaScript TypeScript ไม่ใช่เครื่องมือ linting การประกาศตัวแปรซ้ำที่ประกาศแล้วถือว่าใช้ได้ใน EcmaScript (มันไม่มีผลอะไร) และการประกาศตัวแปรจะถูกยกขึ้นไปด้านบน ดังนั้นจึงไม่มีทางที่คุณจะเข้าถึงตัวแปรก่อนที่มันจะถูกประกาศได้

ตัวแรกเหมือนกับ:

function myFunction(len: number) {
    len = 5;
}

ตัวที่สองเหมือนกับ:

function myFunction() {
    var b: number, a: number;
    b = a;
    a = 5;
}

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