Ý nghĩa của “=>” trong TypeScript là gì? (Mũi tên béo)


78

Tôi mới bắt đầu học TypeScript, và tôi thấy có rất nhiều mã sử dụng sytax này =>. Tôi đã thực hiện một số nghiên cứu bằng cách đọc Đặc tả của TypeScript Phiên bản 1.6 và một số googling. Tôi vẫn không thể hiểu ý nghĩa của =>.
Đối với tôi, nó giống như một con trỏ trong C ++. Nhưng tôi không thể xác nhận nó. Nếu ai đó có thể giải thích các ví dụ sau, điều đó sẽ rất tuyệt. Cảm ơn bạn!

Dưới đây là các ví dụ mà tôi đã tìm thấy khi đọc đặc tả của Typecript:

Các loại đối tượng

var MakePoint: () => {  
    x: number; y: number;  
};

Câu hỏi: Đoạn mã này đang làm gì? Tạo một đối tượng được gọi là MakePoint , trong đó các trường x và y là kiểu số ? Đây là một hàm tạo hay một hàm cho MakePoint ?

Các loại chức năng

function vote(candidate: string, callback: (result: string) => any) {  
 // ...  
}

Câu hỏi: Ý nghĩa của là => anygì? Bạn có phải trả về kiểu chuỗi không?

Bất cứ ai có thể giải thích cho tôi sự khác biệt hoặc mục đích của những ví dụ này bằng tiếng Anh đơn giản không? Cảm ơn bạn đã dành thời gian!


1
Điều này có thể cũng giúp đỡ: codebelt.com/typescript/arrow-function-typescript-tutorial
— zedfoxus

Câu trả lời:


94

Có lẽ bạn đang nhầm lẫn giữa thông tin kiểu với khai báo hàm. Nếu bạn biên dịch như sau :

var MakePoint: () => {x: number; y: number;};

bạn sẽ thấy rằng nó tạo ra:

var MakePoint;

Trong TypeScript, mọi thứ đứng sau :nhưng trước một =(phép gán) đều là thông tin kiểu. Vì vậy, ví dụ của bạn đang nói rằng loại MakePoint là một hàm nhận 0 đối số và trả về một đối tượng có hai thuộc tính xvà ycả hai số. Nó không gán một hàm cho biến đó. Ngược lại, biên dịch:

var MakePoint = () => 1;

sản xuất:

var MakePoint = function () { return 1; };

Lưu ý rằng trong trường hợp này, =>mũi tên béo xuất hiện sau toán tử gán.


2
Nếu MakePoint là một hàm, tại sao không chỉ sử dụng khai báo hàm JavaScript thông thường? Ví dụ function MakePoint() { ...} ?
— Shaohao Lin

9
@ShaohaoLin Nó ngắn hơn và bỏ qua tên ( ()=>...), và nó giữ nguyên phạm vi của thisnó, nghĩa là bạn không còn phải tạo var self = thisbiến hoặc chuyển thisqua các đối số của hàm. Thông tin thêm ở đây
— mk.

Làm cách nào tôi có thể truy cập tài sản xvà ytrong ví dụ của bạn var MakePoint = () => 1? xvà ycả hai đều được gán cho 1?
— Shaohao Lin

1
@ShaohaoLin Trong trường hợp đầu tiên quaMakePoint().x . MakePointlà một hàm trả về một đối tượng có thuộc tính x. Nhưng trong trường hợp thứ hai, bạn phải viết lại nó thành var MakePoint = () => ({x: 1, y: 1});(lưu ý ()xung quanh đối tượng) để nó trả về đối tượng bạn muốn thay vì số 1 (mà tôi đang sử dụng làm ví dụ).
— mk.

@ShaohaoLin Tôi xin lỗi, tôi không hiểu bạn đang hỏi gì trong câu hỏi đã thêm của mình. Thông thường, việc đặt một câu hỏi mới sẽ dễ dàng hơn nhiều vì bạn có nhiều không gian hơn để giải thích câu hỏi là gì. Ngoài ra, nếu bạn thêm thông tin sau, điều này sẽ khiến người đọc bối rối và không ai quay lại để xem các thay đổi / câu hỏi mới của bạn.
— mk.

29

Trong vị trí kiểu, =>xác định một kiểu hàm trong đó các đối số ở bên trái =>và kiểu trả về ở bên phải. Vậy callback: (result: string) => anycó nghĩa là " callbacklà một tham số có kiểu là một hàm. Hàm đó nhận một tham số được gọi là resultkiểu stringvà giá trị trả về của hàm là kiểu any".

Đối với cấu trúc cấp biểu thức, hãy xem Ý nghĩa của "=>" (mũi tên được hình thành từ dấu bằng & lớn hơn) trong JavaScript là gì?


Vậy trong trường hợp này, callback chỉ là tên của hàm?
— Shaohao Lin

1
@ShaohaoLin đó là tên của một tham số và kiểu của tham số đó sẽ là một hàm (nhưng tên của bất kỳ hàm nào bạn truyền vào làm đối số có thể là bất cứ thứ gì)
— mk.

đây thực sự là câu trả lời duy giải thích có sự khác biệt giữa các mũi tên chất béo trong nguyên cảo và trong kịch bản emca
— oshell

@ryan, bạn có thể giải thích điều này có nghĩa là gì. p => this.people = pDấu bằng thứ hai làm gì ở đây?
— cảnh giác

1
vâng, nhưng ý nghĩa của toàn bộ dòng là gì? có phải "p là một biến mà kiểu của nó có thể là bất kỳ và nó trả về this. những người có giá trị bằng p (ở bên phải) không?"? Nhưng dù sao thì tôi cũng không thể hiểu được. :(
— vigamage

20
var MakePoint: () => {  
    x: number; y: number;  
};

MakePointlà một biến. Kiểu của nó là một hàm không có đối số và tạo ra các số x và y. Bây giờ mũi tên có ý nghĩa không?


1
Trên đây là câu trả lời tốt nhất.
— Niklas R.

14

Như một nhà thông thái đã từng nói "Tôi ghét JavaScript vì nó có xu hướng đánh mất ý nghĩa của điều này quá dễ dàng".

Nó được gọi là mũi tên béo (vì ->là mũi tên mỏng và =>là mũi tên béo) và còn được gọi là hàm lambda (vì các ngôn ngữ khác). Một tính năng thường được sử dụng khác là chức năng mũi tên béo ()=>something. Động lực cho một mũi tên béo là:

  1. Bạn không cần phải tiếp tục nhập function.
  2. Nó nắm bắt một cách từ vựng ý nghĩa của this.
  3. Nó nắm bắt một cách từ vựng ý nghĩa của arguments

function Person(age) {
this.age = age;
this.growOld = function() {
    this.age++;
  }
}

var person = new Person(1);
setTimeout(person.growOld,1000);

setTimeout(function() { console.log(person.age); },2000); // 1, should have been 2

Nếu bạn chạy mã này trong trình duyệt, mã này trong hàm sẽ trỏ tới cửa sổ vì cửa sổ sẽ là thứ thực thi hàm growOld. Cách khắc phục là sử dụng hàm mũi tên:


function Person(age) {
this.age = age;
this.growOld = () => {
    this.age++;
  }
}
var person = new Person(1);
setTimeout(person.growOld,1000);

setTimeout(function() { console.log(person.age); },2000);// 2

6

Nó được gọi là "mũi tên béo". Nó đã được thêm vào EcmaScript6 và thay thế từ khóa hàm trong số những thứ khác.

Có thể đọc thêm ở đây .


3

Trực tiếp từ liên kết trong OP:

Trong ví dụ này, tham số thứ hai để 'bỏ phiếu' có kiểu hàm

(result: string) => any có nghĩa là tham số thứ hai là một hàm trả về kiểu 'bất kỳ' có một tham số duy nhất thuộc kiểu 'string' có tên là 'result'.



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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.