TypeScript: Tạo một mảng container được gõ trống


184

Tôi đang tạo ra trò chơi logic đơn giản có tên "Three of a Crime" trong TypeScript.

Khi cố gắng phân bổ mảng đã gõ trong TypeScript, tôi đã thử làm một cái gì đó như thế này:

var arr = Criminal[];

trong đó đưa ra lỗi "Kiểm tra định dạng của cụm từ biểu thức".

cũng đã thử làm điều này

var arr : Criminal = [];

và điều này được tạo ra "không thể chuyển đổi bất kỳ [] thành 'Hình sự'

cách 'TypeScript' để làm điều này là gì?

Câu trả lời:


168

Các câu trả lời hiện tại đã bỏ lỡ một tùy chọn, vì vậy đây là một danh sách đầy đủ:

// 1. Explicitly declare the type
var arr: Criminal[] = [];

// 2. Via type assertion
var arr = <Criminal[]>[];
var arr = [] as Criminal[];

// 3. Using the Array constructor
var arr = new Array<Criminal>();
  1. Rõ ràng chỉ định loại là giải pháp chung cho bất cứ khi nào suy luận kiểu không thành công cho một khai báo biến.

  2. Ưu điểm của việc sử dụng một xác nhận kiểu (đôi khi được gọi là cast, nhưng nó không thực sự là cast trong TypeScript) hoạt động cho bất kỳ biểu thức nào, vì vậy nó có thể được sử dụng ngay cả khi không có biến nào được khai báo. Có hai cú pháp cho các xác nhận kiểu, nhưng chỉ các cú pháp sau sẽ hoạt động kết hợp với JSX nếu bạn quan tâm đến điều đó.

  3. Sử dụng hàm tạo Array là thứ sẽ chỉ giúp bạn trong trường hợp sử dụng cụ thể này, nhưng cá nhân tôi thấy dễ đọc nhất. Tuy nhiên, có một tác động hiệu suất nhẹ trong thời gian chạy *. Ngoài ra, nếu ai đó đủ điên rồ để xác định lại hàm tạo Array, ý nghĩa có thể thay đổi .

Đó là vấn đề sở thích cá nhân, nhưng tôi thấy tùy chọn thứ ba là dễ đọc nhất. Trong phần lớn các trường hợp, nhược điểm được đề cập sẽ không đáng kể và khả năng đọc là yếu tố quan trọng nhất.

*: Sự thật thú vị; tại thời điểm viết chênh lệch hiệu suất là 60% trong Chrome, trong khi ở Firefox không có sự khác biệt về hiệu suất.


60% ?? : O Thật hoang dã
Max Coplan

239

Vấn đề phân bổ chính xác một mảng đã gõ trong TypeScript có phần bị che khuất do cú pháp theo nghĩa đen của mảng, vì vậy nó không trực quan như tôi nghĩ đầu tiên.

Cách chính xác sẽ là

var arr : Criminal[] = [];

Điều này sẽ cung cấp cho bạn một mảng trống được gõ chính xác, được lưu trữ trong biến 'Array'

Hy vọng điều này sẽ giúp người khác!


20

Tôi biết đây là một câu hỏi cũ nhưng gần đây tôi đã phải đối mặt với một vấn đề tương tự không thể giải quyết bằng cách này, vì tôi phải trả lại một mảng trống của một loại cụ thể.

Tôi đã có

return [];

nơi []đã Criminal[]loại.

Không return: Criminal[] [];phải cũng không return []: Criminal[];làm việc cho tôi.

Thoạt nhìn tôi đã giải quyết nó bằng cách tạo một biến được gõ (như bạn đã báo cáo chính xác) ngay trước khi trả lại, nhưng (tôi không biết công cụ JavaScript hoạt động như thế nào) nó có thể tạo ra chi phí và nó ít đọc hơn.

Để tìm hiểu kỹ, tôi cũng sẽ báo cáo giải pháp này trong câu trả lời của mình:

let temp: Criminal[] = [];
return temp;

Cuối cùng, tôi đã tìm thấy kiểu truyền kiểu TypeScript, cho phép tôi giải quyết vấn đề theo cách ngắn gọn và dễ đọc hơn (và có thể hiệu quả):

return <Criminal[]>[];

Hy vọng điều này sẽ giúp độc giả trong tương lai!


1

Để sử dụng truy cập công khai như dưới đây:

public arr: Criminal[] = [];
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.