Một điều "kì lạ" mà "hợp lý" về hàm trong Typescript
TIL
804
TypeScript
13
White

unique_name viết ngày 05/12/2021

Typescript có 1 hệ thống type rất tốt cho hàm. Để biểu diễn type cho hàm, có các cách như sau

const func = (): void => {
    console.log('hello');
}

const func: () => void = () => {
    console.log('hello');
}

function func(): number {
    return 1;
}

Khi một hàm có type trả về là void, thì nó không được phép return các giá trị number, string... Ví dụ:

function voidFunc(): void {
    return 1;    //Error
}

Rõ ràng!!

Tuy nhiên, đoạn code sau vẫn hợp lệ

type VoidFn = () => void;
const func: VoidFn = () => true;   //Ok
const func2: VoidFn = () => { return 1; };  //Ok

Sao kì vậy? Rõ ràng là 2 hàm kia đâu có return void, tại sao vẫn hợp lệ? Thì câu trả lời đây là một hành vi mong muốn trong Typescript.

Tại sao lại có hành vi này?

  • Đầu tiên, việc mà cho phép gán hàm có giá trị trả về number vào 1 biến func type VoidFn là an toàn, ổn áp. Giá trị number trả về "dư thừa" chứ ko ảnh hưởng gì. Biến func vẫn có type VoidFn và khi sử dụng nó vẫn là
func(); //Ko dùng number trả về, okkkk
  • Hãy xem xét ví dụ sau
const arr = [1, 2];
const brr = [3, 4];

brr.forEach((v) => arr.push(v));

Type của tham số callback của forEach là một hàm trả về kiểu void. Nhưng arg ta truyền vào là 1 hàm trả về kiểu number, vì arr.push trả về kiểu number.

Khi nhìn đoạn code, rõ ràng chúng ta sẽ ko TS muốn báo lỗi nó, vì nó hoàn toàn ok, k ảnh hưởng gì và gọn gàng.

Giả sử TS strict và báo lỗi nó, thì chúng ta sẽ phải viết lại

brr.forEach((v) => {
    arr.push(v);
});

Khá dài dòng!

Qua 2 quan điểm trên, ta thấy việc cho phép một hàm trả về kiểu non-void gán vào hàm trả về kiểu void rất hữu ích.

unique_name 05-12-2021

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

unique_name

2 bài viết.
28 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
White
1 5
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết hơn 3 năm trước
1 5
White
4 0
I used Spring boot, Hibernate few times back then at University, I'v started using it again recently. In this (Link), I want to check how Spring J...
Rey viết 3 năm trước
4 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
2 bài viết.
28 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!