2017-01-30 14 views
25

Khi tôi cho phép noImplicitThis trong tsconfig.json, tôi nhận được lỗi này cho đoạn mã sau:'này' ngầm có kiểu 'bất kỳ' bởi vì nó không có một loại chú thích

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

Thêm gõ this các thông số gọi lại kết quả trong các lỗi tương tự:

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

Một cách giải quyết là để thay thế this với các đối tượng:

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

Nhưng sửa lỗi thích hợp cho lỗi này là gì?


UPDATE: Hóa ra thêm một gõ this để gọi lại thực sự giải quyết các lỗi. Tôi đã nhìn thấy những lỗi vì tôi đã sử dụng một chức năng mũi tên với một loại chú thích cho this:

typescript playground

+0

Bạn đã thử phiên bản TypeScript 2.1 hoặc phiên bản hàng đêm chưa? –

+0

@DanielRosenwasser 2.1.4 – tony19

+0

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

Trả lời

30

Các lỗi thực sự được cố định bằng cách chèn this với một loại chú thích như tham số callback đầu tiên. nỗ lực của tôi để làm điều đó được hỏng bằng cách đồng thời thay đổi callback vào một mũi tên chức năng:

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

Nó nên đã này:

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

hay này:

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

Một GitHub issue được tạo để 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ế ith this và các chức năng mũi tên.

+0

cách bạn khắc phục sự cố với dòng này: https://github.com/pretenderjs/pretender/blame/master/README.md#L30 – Nikos

+0

@Nikos Điều này sẽ hoạt động: 'mới Pretender (chức năng (điều này: Pretender) {}) '[demo] (https://www.typescriptlang.org/play/#src=class%20Pretender%20%7B%0D%0A%20%20%20%20constructor (f% 3A% 20 Chức năng)% 20% 7B% 20% 7D% 0D% 0A% 20% 20% 20% 20get (s% 3A% 20 chuỗi% 2C% 20f% 3A% 20 Chức năng)% 20% 7B% 20% 7D% 0D% 0A% 7D% 0D% 0A % 0D% 0Aconst% 20server% 20% 3D% 20new% 20Pretender (chức năng% 20 (% 3A% 20Pretender)% 20% 7B% 0D% 0A% 20% 20% 20% 20this.get ('% 2Fphotos'% 2C % 20function% 20()% 20% 7B% 0D% 0A% 20% 20% 20% 20% 20% 20% 20% 20console.log ('hello')% 3B% 0D% 0A% 20% 20% 20% 20% 7D)% 3B% 0D% 0A% 7D)% 3B% 0D% 0A) – tony19

Các vấn đề liên quan