'this' ngầm có kiểu "bất kỳ" vì nó không có chú thích kiểu


123

Khi tôi cho phép noImplicitThistrong tsconfig.json, tôi nhận được lỗi này cho đoạn mã sau:

'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`
});

Việc thêm một đã nhập thisvào các tham số gọi lại dẫn đến cùng một lỗi:

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

Một cách giải quyết là thay thế thisbằng đối tượng:

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

Nhưng cách khắc phục thích hợp cho lỗi này là gì?


CẬP NHẬT: Hóa ra việc thêm một đã nhập thisvào lệnh gọi lại thực sự giải quyết được lỗi. Tôi gặp lỗi vì tôi đang sử dụng hàm mũi tên với chú thích loại cho this:

sân chơi đánh chữ


Bạn đã thử điều này trên TypeScript 2.1 hoặc phiên bản hàng đêm chưa?
Daniel Rosenwasser vào

@DanielRosenwasser 2.1.4
tony 19

Và bây giờ tôi thấy lý do WebStorm và sân chơi TS phàn nàn: Tôi đang sử dụng hàm mũi tên trong khi cung cấp chú thích kiểu cho this.
tony 19

2
Tôi đã gửi một lỗi tại đây: github.com/Microsoft/TypeScript/issues/13768 - vui lòng theo dõi lỗi và ủng hộ.
Daniel Rosenwasser

Câu trả lời:


139

Lỗi thực sự đã được khắc phục bằng cách chèn thischú thích kiểu làm tham số gọi lại đầu tiên. Nỗ lực của tôi để làm điều đó đã bị thất bại khi đồng thời thay đổi lệnh gọi lại thành một hàm mũi tên:

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

Đáng lẽ ra nó phải là thế này:

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

hoặc cái này:

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

Một vấn đề GitHub được tạo ra để cải thiện thông báo lỗi của trình biên dịch và làm nổi bật lỗi ngữ pháp thực tế với thisvà các hàm mũi tên.


Loại chú thích 'this' cần phải có, nếu bạn sử dụng 'this' trong hàm tạo?
BluE

@BluE Giả sử một thuộc tính / chức năng thành viên đang được tham chiếu, thissẽ là kiểu của lớp được khởi tạo. Ví dụ, nếu constructorlà cho lớp MyClass, thì loại chú thích cho thissẽ là MyClass.
tony 19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.