"this" โดยปริยายมี type "any" เนื่องจากไม่มีคำอธิบายประกอบประเภท


125

เมื่อฉันเปิดใช้งานnoImplicitThisในtsconfig.jsonที่ฉันได้รับข้อผิดพลาดนี้รหัสต่อไปนี้:

'this' implicitly has type 'any' because it does not have a type annotation.
class Foo implements EventEmitter {
  on(name: string, fn: Function) { }
  emit(name: string) { }
}

const foo = new Foo();
foo.on('error', function(err: any) {
  console.log(err);
  this.emit('end');  // error: `this` implicitly has type `any`
});

การเพิ่มการพิมพ์ลงthisในพารามิเตอร์การเรียกกลับจะทำให้เกิดข้อผิดพลาดเดียวกัน:

foo.on('error', (this: Foo, err: any) => { // error: `this` implicitly has type `any`

วิธีแก้ปัญหาคือแทนที่thisด้วยวัตถุ:

foo.on('error', (err: any) => {
  console.log(err);
  foo.emit('end');
});

แต่การแก้ไขที่เหมาะสมสำหรับข้อผิดพลาดนี้คืออะไร?


อัปเดต:ปรากฎว่าการเพิ่มที่พิมพ์ลงthisในการโทรกลับเป็นการแก้ไขข้อผิดพลาด ฉันเห็นข้อผิดพลาดเนื่องจากฉันใช้ฟังก์ชันลูกศรพร้อมคำอธิบายประกอบประเภทสำหรับthis:

สนามเด็กเล่น typescript


คุณลองใช้ TypeScript 2.1 หรือเวอร์ชันกลางคืนหรือไม่?
Daniel Rosenwasser

@DanielRosenwasser 2.1.4
tony19

และตอนนี้ฉันเห็นเหตุผลที่ WebStorm และ TS playground บ่น: ฉันใช้ฟังก์ชันลูกศรในขณะที่ใส่คำอธิบายประกอบประเภทสำหรับthis.
tony19

2
ฉันยื่นข้อบกพร่องที่นี่: github.com/Microsoft/TypeScript/issues/13768 - อย่าลังเลที่จะติดตามและยกนิ้วให้
Daniel Rosenwasser

คำตอบ:


141

ข้อผิดพลาดได้รับการแก้ไขโดยการใส่thisคำอธิบายประกอบประเภทเป็นพารามิเตอร์เรียกกลับแรก ความพยายามของฉันในการทำเช่นนั้นไม่สมบูรณ์โดยการเปลี่ยนการโทรกลับเป็นฟังก์ชันลูกศรพร้อมกัน:

foo.on('error', (this: Foo, err: any) => { // DON'T DO THIS

ควรเป็นสิ่งนี้:

foo.on('error', function(this: Foo, err: any) {

หรือสิ่งนี้:

foo.on('error', function(this: typeof foo, err: any) {

ปัญหา GitHub ถูกสร้างขึ้นเพื่อปรับปรุงข้อความแสดงข้อผิดพลาดของคอมไพเลอร์และเน้นข้อผิดพลาดทางไวยากรณ์จริงด้วยthisและฟังก์ชันลูกศร


คำอธิบายประกอบประเภทใดที่ "สิ่งนี้" จำเป็นต้องมีหากคุณใช้ "this" ในตัวสร้าง
สีฟ้า

@BluE สมมติว่ามีการอ้างถึงคุณสมบัติ / ฟังก์ชันของสมาชิกthisจะเป็นประเภทของคลาสที่กำลังเริ่มต้น ตัวอย่างเช่นถ้าconstructorเป็นสำหรับการเรียนMyClass, บันทึกย่อชนิดสำหรับจะเป็นthis MyClass
tony19
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.