Sự khác biệt giữa any và unknown
Cả hai kiểu any và unknown đều có thể được gán bất kỳ giá trị nào.
tsconstany1 : any = null;constany2 : any =undefined ;constany3 : any = true;constany4 : any = 0.8;constany5 : any = "Comment allez-vous";constany6 : any = {x : 0,y : 1,name : "origin",};constunknown1 : unknown = null;constunknown2 : unknown =undefined ;constunknown3 : unknown = true;constunknown4 : unknown = 0.8;constunknown5 : unknown = "Comment allez-vous";constunknown6 : unknown = {x : 0,y : 1,name : "origin",};
tsconstany1 : any = null;constany2 : any =undefined ;constany3 : any = true;constany4 : any = 0.8;constany5 : any = "Comment allez-vous";constany6 : any = {x : 0,y : 1,name : "origin",};constunknown1 : unknown = null;constunknown2 : unknown =undefined ;constunknown3 : unknown = true;constunknown4 : unknown = 0.8;constunknown5 : unknown = "Comment allez-vous";constunknown6 : unknown = {x : 0,y : 1,name : "origin",};
Ngoài ra, có một kiểu ngược lại là never, không thể gán bất kỳ giá trị nào, nhưng ở đây chúng ta sẽ không giải thích về nó.
Với kiểu any, bạn có thể sử dụng các property và method của object đã được gán.
tsconsole .log (any4 .toFixed ());console .log (any5 .length );console .log (any6 .name );
tsconsole .log (any4 .toFixed ());console .log (any5 .length );console .log (any6 .name );
Ngược lại, với kiểu unknown, bạn không thể sử dụng các property và method của object đã được gán. Không chỉ không sử dụng được, mà còn không thể thực thi.
ts'unknown4' is of type 'unknown'.18046'unknown4' is of type 'unknown'.console .log (. unknown4 toFixed ());'unknown5' is of type 'unknown'.18046'unknown5' is of type 'unknown'.console .log (. unknown5 length );'unknown6' is of type 'unknown'.18046'unknown6' is of type 'unknown'.console .log (. unknown6 name );
ts'unknown4' is of type 'unknown'.18046'unknown4' is of type 'unknown'.console .log (. unknown4 toFixed ());'unknown5' is of type 'unknown'.18046'unknown5' is of type 'unknown'.console .log (. unknown5 length );'unknown6' is of type 'unknown'.18046'unknown6' is of type 'unknown'.console .log (. unknown6 name );
Chỉ nhìn vào điều này có thể nghĩ rằng kiểu any tốt hơn kiểu unknown, nhưng không phải vậy. Nói cách khác, kiểu any là kiểu mà TypeScript từ bỏ việc kiểm tra kiểu, vì vậy bạn có thể làm bất cứ điều gì. Sử dụng kiểu any giống như đang từ bỏ lợi ích về kiểu mà TypeScript mang lại.
Khi đó, các lỗi tồn tại sẽ không được phát hiện tại thời điểm compile, và sẽ trở thành lỗi runtime khi người dùng thực tế sử dụng sau khi phát hành phần mềm. Điều đó dẫn đến báo cáo lỗi và khiếu nại, làm thiệt hại lan rộng.
Với kiểu any, TypeScript hoàn toàn không can thiệp vào những đoạn code vô lý như sau, và chỉ khi chạy thử chương trình gặp lỗi runtime, ta mới biết được chương trình này không hoàn chỉnh.
tsconsole .log (any6 .x .y .z );
tsconsole .log (any6 .x .y .z );
Kiểu unknown nhất quán không cho phép truy cập property và method. Vì vậy không thể thực thi, và ngăn chặn lỗi runtime không mong muốn.
ts'unknown6' is of type 'unknown'.18046'unknown6' is of type 'unknown'.console .log (. unknown6 x .y .z );
ts'unknown6' is of type 'unknown'.18046'unknown6' is of type 'unknown'.console .log (. unknown6 x .y .z );
Trong file tsconfig.json cần thiết khi tạo project TypeScript, có option noImplicitAny để ngăn chặn việc sử dụng kiểu any. Nếu bạn tạo project TypeScript từ đầu thay vì chuyển đổi project JavaScript hiện có sang TypeScript, nên bật cài đặt này.