'không biết' so với 'bất kỳ'


190

TypeScript 3.0 giới thiệu unknownloại, theo wiki của họ:

không biết bây giờ là một tên loại dành riêng, vì bây giờ nó là một loại tích hợp. Tùy thuộc vào mục đích sử dụng không xác định của bạn, bạn có thể muốn xóa hoàn toàn khai báo (ưu tiên loại không xác định mới được giới thiệu) hoặc đổi tên thành tên khác.

Sự khác biệt giữa unknownvà là anygì? Khi nào chúng ta nên sử dụng unknownhơn any?

Câu trả lời:


233

Bạn có thể đọc thêm về unknowntrong PR hoặc các thông báo RC , nhưng các ý chính của nó là:

[..] không biết đó là đối tác an toàn loại nào. Bất cứ điều gì đều có thể được gán cho không xác định, nhưng không biết không thể gán cho bất cứ thứ gì ngoại trừ chính nó và bất kỳ thứ gì mà không có xác nhận kiểu hoặc thu hẹp dựa trên luồng điều khiển. Tương tự như vậy, không có thao tác nào được phép trên một ẩn số mà không xác nhận trước hoặc thu hẹp thành một loại cụ thể hơn.

Một vài ví dụ:

let vAny: any = 10;          // We can assign anthing to any
let vUnknown: unknown =  10; // We can assign anthing to unknown just like any 


let s1: string = vAny;     // Any is assigable to anything 
let s2: string = vUnknown; // Invalid we can't assign vUnknown to any other type (without an explicit assertion)

vAny.method();     // ok anything goes with any
vUnknown.method(); // not ok, we don't know anything about this variable

Cách sử dụng được đề xuất là:

Đôi khi chúng tôi muốn mô tả loại có khả năng thấp nhất trong TypeScript. Điều này rất hữu ích cho các API muốn báo hiệu cho điều này có thể là bất kỳ giá trị nào, vì vậy bạn phải thực hiện một số loại kiểm tra trước khi bạn sử dụng nó. Điều này buộc người dùng phải hướng nội một cách an toàn các giá trị được trả về.


35
Bất cứ ai đến từ nền C #, anyđều thích dynamicunknownthích object. Tôi thích unknownvì nó chỉ là loại an toàn hơn. Tên khó hiểu mặc dù.
nawfal

1
Tôi không biết rằng đây là một sự công bằng khi so sánh unknownobject@nawfal mặc dù tôi nghĩ rằng tôi thấy những gì bạn đang gặp phải về mặt đối lập và hiệp phương sai (ví dụ: mọi đối tượng đều có thể được gán để nhập objectmặc dù đối với unknownbất kỳ đối tượng hoặc nguyên thủy nào đều có thể được chỉ định - tương tự unknowncó thể được gán cho anyhoặc chính nó và objectcó thể được gán cho dynamichoặc chính nó). Bên cạnh đó, tôi không rõ lý do tại sao các tài liệu TS đề cập đến unknownnhư một loại hàng đầu bởi vì nó không thực sự chứa tất cả các loại _ (ツ) _ /
Jordan

38

Sự khác biệt giữa không biết và bất kỳ được mô tả là:

Giống như any, bất kỳ giá trị nào cũng được gán cho unknown; tuy nhiên, không giống như any, bạn không thể truy cập bất kỳ thuộc tính nào trên các giá trị với loại unknownvà bạn cũng không thể gọi / xây dựng chúng. Hơn nữa, các giá trị của loại unknownchỉ có thể được gán cho unknownhoặc any.

Để trả lời câu hỏi của bạn khi nào bạn nên sử dụng unknownhơn any:

Điều này rất hữu ích cho các API muốn báo hiệu cho điều này có thể là bất kỳ giá trị nào, vì vậy bạn phải thực hiện một số loại kiểm tra trước khi bạn sử dụng nó. Điều này buộc người dùng phải hướng nội một cách an toàn các giá trị được trả về.

Hãy xem thông báo TypeScript 3.0 để biết ví dụ về loại kiểm tra một biến loại unknownvà giải thích chi tiết hơn.


21

any kiểu:

Các anyloại đại diện cho tất cả các giá trị JS càng tốt. Mỗi loại được gán để gõ any. Do đó, loại anynày là một siêu kiểu phổ quát của hệ thống loại. Trình biên dịch TS sẽ cho phép mọi thao tác trên các giá trị được nhập any. Ví dụ:

let myVar: any;

myVar[0];
myVar();
myVar.length;
new myVar();

Trong nhiều trường hợp, điều này là quá khoan dung của trình biên dịch TS. tức là nó sẽ cho phép các hoạt động mà chúng ta có thể đã biết dẫn đến lỗi thời gian chạy.

unknown kiểu:

Các unknownloại đại diện (giống như any) tất cả các giá trị JS càng tốt. Mỗi loại được gán để gõ unknown. Do đó, loại unknownnày là một siêu kiểu phổ quát khác của hệ thống loại (cùng với any). Tuy nhiên, trình biên dịch TS sẽ không cho phép bất kỳ thao tác nào trên các giá trị được nhập unknown. Hơn nữa, unknownloại chỉ được gán cho loại any. Một ví dụ sẽ làm rõ điều này:

let myVar: unknown;

let myVar1: unknown = myVar;   // No error
let myVar2: any = myVar;       // No error
let myVar3: boolean = myVar;   // Type 'unknown' is not assignable to type 'boolean'

// The following operations on myVar all give the error:
// Object is of type 'unknown'
myVar[0];
myVar();
myVar.length;
new myVar();
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.