Interface trong Typescript
xin chào
mình copy đoạn code trên trang để học, nhưng về chạy báo lỗi này, liệu có phải do người ta hiểu sai Typescipt không ạ?
Chưa khởi tạo?
Bạn có thể gửi t code hoàn chỉnh, dựa trên ảnh kia, có thể chạy được ko ạ !?
let strArr: IStringList = {}
Khởi tạo nó đi là chạy được.
cho mình hỏi xíu, tại sao không phải là:
let strArr: IStringList = [], mà lại dùng ngoặc nhọn ạ?
khiếp js còn k biết mà đã học ts thế này khuyên chân thành bạn bỏ ngay đi chứ học chỉ tốn thời gian
lời khuyên gì mà tiêu cực thế, dấu {}, trong JS thể hiện 1 object, nhưng theo tiêu đề ảnh họ ghi là ; type of array, nên nhẽ ra phải dùng ngoặc vuông chứ.
với lại cả code của họ copy về cũng không chạy được, chứng tỏ họ còn dạy sai, hoặc thiếu gì đó.
à thấy rồi, là mình sai khi không đọc kỹ, mình tưởng là bạn không biết [] với {}
Quay trở lại vấn đề, code ví dụ không chạy thì bạn nên tìm trang khác học cho lành.
Ở đây để hiểu hơn thì có thể thay {} thành [] xem nó báo gì là hiểu tại sao cần {}.
Ví dụ này khá tệ khi mặc dù có thể viết x[‘name’] = 1 với x là 1 mảng, nhưng không ai làm thế bao giờ, người ta chỉ viết vậy với x là 1 object
Không, thực chất name
ở đây là index . Nhìn giống Object thông thường thôi nhưng không, thực chất đó là một cái mảng với biến đếm thuộc kiểu chuỗi (đúng rồi đấy, không nghe nhầm đâu), mà đằng nào khi compile về Javascript nó cũng ra Object thôi
Ở phần Indexable Types có ghi:
There are two types of supported index signatures: string and number. It is possible to support both types of indexers, but the type returned from a numeric indexer must be a subtype of the type returned from the string indexer.
Thực tế là có người viết kiểu đó. Cách viết trên thực chất bắt nguồn từ JSON, JSON là một kiểu định dạng dữ liệu, vì thế nên tên của các thuộc tính không thể bị bó hẹp bởi quy tắc đặt tên biến được. Không chỉ Javascript mà ngay cả Python cũng có cái kiểu đó.
đó mình cũng suy nghĩ theo hướng của cái ví dụ là ,index nó đánh thứ tự theo chuỗi chứ không phải đánh index theo số.
nhưng ko hiểu lắm đánh theo chuỗi kiểu gì nhỉ, ví dụ như số thì có số tự nhiên: 1,2,3,4.
vậy chuỗi chúng ta quy ước như nào giờ?
Thực tế là có. Cách viết trên thực chất bắt nguồn từ JSON, JSON là một kiểu định dạng dữ liệu
Bạn nói có là có cái gì ấy nhỉ? Ý là vụ khai bảo x[‘name’] với x là mảng ấy hả? Bạn có use case cụ thể không?
vậy chuỗi chúng ta quy ước như nào giờ?
array là tự động nó đánh số index rồi, chỉ việc khai báo item trong mảng thôi, index tự động tăng như bạn nói, k cần quy ước gì hết
còn đánh index theo chuỗi thì như mình đã ví dụ x[‘name’] = 1 với x là 1 mảng
Ví dụ có một cái JSON Object như sau:
let obj = {
"Nguyễn Văn A": {
"tuoi": 100
}
Nếu muốn lấy tuổi của Nguyễn Văn A trong obj thì không thể ghi thế này:
console.log(obj.Nguyễn Văn A.tuoi) //Cái này sai cú pháp, không hợp lệ
Mà phải ghi:
console.log(obj["Nguyễn Văn A"].tuoi)
//Hoặc:
console.log(obj["Nguyễn Văn A"]["tuoi"])
Hoặc một ví dụ khác, khi có một chuỗi chứa thuộc tính cần lấy giá trị thì sao? Cũng phải dùng cách trên:
let prop = "Foo"
let obj = {"Foo": 10}
console.log(obj[prop])
Hoặc một ví dụ khác, làm sao để chuyển FormData thành JSON Object?
let formData = new FormData();
let object = {};
formData.forEach((value, key) => {object[key] = value});
let json = JSON.stringify(object);
Muốn đánh index theo chuỗi, ngoài cách của @Lovemagic ra còn có một cách khác nữa là làm giống kiểu JSON Object:
interface NumberMap {
[key: string]: number;
}
const num_are : NumberMap = {
one: 1,
two: 2,
three: 3
}
thế nào mà ví dụ toàn sử dụng object thế kia nhỉ? mình ghi rất rõ ràng, x là 1 mảng
còn việc cách gọi object bằng dot notation hay brackets thì k nói nha
À, mình đang nói tới đoạn này:
k hiểu sao bạn lại đi cắt 1 đoạn rất nhỏ như vậy, mà lại cắt sai
Cả câu đây:
ý của nó là người ta chỉ viết x[‘name’] = 1 khi x là 1 object, cái mà bạn đã dày công viết nguyên 1 đoạn rất dài liên quan tới cả json luôn.
Mình đang nói đến đoạn không ai làm thế bao giờ
.
thua bạn ơi, mình nói vậy mà bạn vẫn không hiểu thì nên dừng ở đây
Cuối cùng, ý mình nhắc ở đây là cách dùng bracket khá phổ biến. Dừng thì dừng thôi
Tớ chỉ correct chút thôi @Lovemagic, với mục đích mở rộng cho ai cần thôi
Có 1 khái niệm trong computer science gọi là “associative array” (a.k.a dictionary, map, symbol table…), trong đó cậu có thể sử dụng 1 xâu như index
Có rất nhiều ngôn ngữ support khái niệm này natively, tớ có thể kể ra Perl và PHP, hay python (dưới tên Dictionary).
Trong các ngôn ngữ khác như Java, associative array được thể hiện ở collection Map
. Javascript thì không support associative array natively, nó chỉ có object thôi với cách sử dụng dễ bị nhầm với associative array thôi Vậy nên, tớ nghĩ có lẽ không nên nhầm lẫn associative array với việc gọi thuộc tính của object vì sự củ chuối của Javascript (Sorry cậu nếu tớ hiểu nhầm ý của cậu nhé! Tớ nghĩ có lẽ cậu bị confuse với Javascript object nên tớ nói vậy).
Ví dụ trong câu hỏi của Hoàng đưa ra là 1 cách implement associative array bằng Typescript, sử dụng index signature, nó khá thú vị