Mảng <Loại> Loại VS [] trong Bản in


162

Theo như tôi biết thì loại tài sản có thể được định nghĩa theo hai cách khi đó là Mảng.

property_name: type

nơi loại có thể là một trong hai

Array<string>, Array<MyType>, etc. (e.g. let prop1: Array<string>)

string[], MyType[], etc. (e.g. let prop1: string[])

Sự khác biệt giữa hai trường hợp là gì? Hoặc tôi đang hiểu nhầm điều gì đó (có lẽ là điều gì đó về <> được sử dụng trong quá trình đúc?)

EDIT vì câu hỏi được đánh dấu là trùng lặp, tôi biết có một câu hỏi khác về bất kỳ [] nào nhưng tôi vẫn xem qua nó trước khi đăng và với tôi nó là về loại 'bất kỳ' hơn so với [] VS <khác > Tôi hỏi


3
Bản sao có thể có của Arraycript Array so với bất kỳ []
Nitzan Tomer

1
Chúng thực tế là các cấu trúc giống nhau, và thực sự là các đối tượng giống nhau trong thời gian chạy. Reflect-metadata cũng sẽ coi cả hai có Arrayđối tượng là hàm tạo của chúng. Xem câu trả lời liên kết ở trên.
John Weisz

3
@NitzanTomer câu hỏi đó đã lỗi thời - Array<T>không tồn tại trước đó.
Nathan Shively-Sanders

@ NathanShively-Sanders câu trả lời là như nhau có hoặc không có Generics vì câu hỏi này có thể được giảm xuống "những gì là sự khác nhau giữa let x: Array;để let x: any[];"
Nitzan Tomer

Câu trả lời:


168

Không có sự khác biệt về ngữ nghĩa

Không có sự khác biệt nào cả. Type[]cú pháp tốc ký cho một mảng Type. Array<Type>cú pháp chung . Chúng hoàn toàn tương đương.

Cẩm nang cung cấp một ví dụ ở đây . Nó tương đương với viết:

function loggingIdentity<T>(arg: T[]): T[] {
    console.log(arg.length);
    return arg;
}

Hoặc là:

function loggingIdentity<T>(arg: Array<T>): Array<T> {
    console.log(arg.length);
    return arg;
}

Và đây là một trích dẫn từ một số ghi chú phát hành :

Cụ thể, number[]là một phiên bản tốc ký của Array<number>, giống như Date[]là một tốc ký cho Array<Date>.

Tuy nhiên, có một trường hợp yêu cầu cú pháp tốc ký

Kể từ TypeScript 3.4, có một sự khác biệt cho công cụ readonlysửa đổi loại mới . Thật:

công cụ readonlysửa đổi kiểu chỉ có thể được sử dụng cho cú pháp trên các kiểu mảng và kiểu tuple

let err2: readonly Array<boolean>; // error!    
let okay: readonly boolean[]; // works fine

Tuy nhiên, tuyên bố sau tương đương với readonly boolean[]:

let okay2: ReadonlyArray<boolean>;

1
@dragonmnl, Đây là một loại chung chung. Chỉ cần đọc phần "Xin chào thế giới của thuốc generic" trong Sổ tay .
Paleo

4
Không có khuyến nghị chính thức. Cá nhân tôi sử dụng tốc ký và chỉ viết tắt ( type[]), vì nó dễ đọc hơn.
Paleo

2
Họ không phải là hoàn toàn giống hệt nhau nữa: typescriptlang.org/docs/handbook/release-notes/...
DShook

1
Nếu tôi hiểu đúng, trong readonlytrường hợp nó không thực sự cần thiết. Nếu bạn thích một ký hiệu dài, bạn có thể viết nó như thế này:let err2: ReadonlyArray<boolean>;
n4nn31355

1
@ n4nn31355 Tôi nghĩ vậy. Tôi chỉnh sửa để thêm thông báo này.
Paleo

-10
foo: Array

có nghĩa là đó là một mảng đơn giản, với một anykiểu ẩn cho các thành viên của nó

foo: string[]

có nghĩa là đó là một chuỗi các chuỗi, tức là TypeScript sẽ bị rối loạn nếu bạn cố gắng đẩy bất cứ thứ gì ngoài chuỗi vào mảng đó.


10
Câu hỏi là Array <string> vs string [], không phải Array vs string [];
Juangui Jordán

Thật kỳ lạ, TypeScript dường như không bận tâm khi tôi chuyển một mảng số cho một phương thức có tham số được xác định làfoo: string[]
jlewkovich

3
Nếu bạn vượt qua một mảng các số, fn ([1,2,3]), thì nó có ích. Nếu bạn truyền một biến và loại không rõ ràng, hãy để a = []; a = [1,2,3]; fn (a), sau đó không bận tâm vì a là loại bất kỳ []
Quentin 2
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.