Nếu TypeScript là một siêu lớn của JavaScript, tại sao ký hiệu chấm trên một đối tượng tùy ý sai? Tôi có mã JS mà tôi muốn chuyển đổi sang TS để có loại an toàn tốt hơn, nhưng tất cả truy cập sử dụng ký pháp chấm (ví dụ: myObj.thing
) sẽ cho tôi lỗi Property 'thing' does not exist on type '{}'.
. Nó hoạt động đúng khi tôi sử dụng ký hiệu khung (ví dụ: myObj['thing']
).Truy cập TypeScript và ký hiệu chấm cho các đối tượng
Trả lời
x
không giữ bất cứ tài sản đặt tên bar
vì vậy bạn cần tạo ra nó trong các đối tượng:
function foobar() {
var x = {
foo: 'foo',
bar: 'bar'
}
return x;
}
alert(foobar().bar); //returns bar
Đó là [JS pháp lý rõ ràng] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects) để gán cho thuộc tính chưa tồn tại trong một đối tượng, vì vậy có vẻ như lẻ mà tôi không thể làm điều đó trong TS mà không có một diễn viên để 'bất kỳ' (như @Asad mô tả ở trên). – user655321
Học thứ gì đó mới mỗi ngày ... Nhiều cách khác nhau để làm da mèo, tôi đoán vậy. – mwilson
mwilson đến đó trước khi tôi có thể! ;)
Trong mã ở trên, Loại bản ghi không thể xác định đối tượng x
cho thấy thuộc tính được gọi là bar
do đó không thể giải quyết khi hiển thị Intellisense.
Thay vào đó, thêm foo
, bar
, vv như các thuộc tính của đối tượng riêng của mình:
var x = {
foo: "FOO",
bar: "BAR"
};
Sau đó, khi sử dụng Typescript Playground, bạn sẽ có thấy công việc Intellisense như mong đợi:
HTH
Tôi biết bạn nói điều này là lạ, nhưng đây là một o f những lý do chính TypeScript tồn tại. Lỗi này giúp ngăn chặn vô tình thiết lập hoặc nhận các thuộc tính không tồn tại trên một đối tượng.
Ngay bây giờ, như trình biên dịch là nói cho bạn, tài sản bar
không tồn tại trên x
vì nó đã được ngầm gõ để {}
khi viết var x = {};
.
Bạn có thể nói với trình biên dịch rằng x
có hơn không tính bằng cách định nghĩa một cách rõ ràng các loại:
var x: { foo?: string; bar?: string; } = {};
Bây giờ bạn có thể nhận hoặc thiết lập x.foo
và x.bar
mà không trình biên dịch phàn nàn. Trong hầu hết các trường hợp, bạn sẽ di chuyển này vào một giao diện như sau:
interface IFooBar {
foo?: string;
bar?: string;
}
var x: IFooBar = {};
x.foo = "asdf"; // ok
x.test = "asdf"; // error, as it should be
Một số người được giới thiệu bạn cast để any
, nhưng không nhận được lười biếng. Bạn nên tận dụng toàn bộ hệ thống kiểu TypeScript cung cấp. Làm như vậy chắc chắn sẽ giúp bạn tiết kiệm thời gian khi bạn duy trì một ứng dụng.
Do tính chất mạnh mẽ, đánh máy của nguyên cảo Object, bạn có thể sử dụng "bất kỳ" để làm cho nó không định kiểu:
var x: any = {};
x.bar = "bar"; /// ok
Nếu những gì bạn cần là để xác định loại tài sản theo nghĩa đen
var x: { [index: string]: TypeA } = {};
thì x["bar"]
bây giờ chỉ có thể là phiên bản của TypeA.
Cá nhân tôi muốn chỉ định các loại bất cứ khi nào tôi có cơ hội.
Lưu ý rằng bạn chỉ có thể khởi tạo biến này với {}
nếu bạn xác định các trường là tùy chọn với toán tử ?:
.
let x: {foo?: string, bar?: string} = {};
x.foo = 'foo';
x.bar = 'bar';
Như những người khác đã nói, nếu bạn dự định sử dụng loại này nhiều lần, có thể tốt hơn là tạo lớp học rõ ràng cho nó.
PS: tốt hơn nên sử dụng let
thay vì var
khi lập trình ở dạng số. (Ví dụ phạm vi của một tuyên bố var
là một chút kỳ quặc, so với một let
mà làm những gì bạn mong đợi nó để làm.)
- 1. Ghi đè ký hiệu chấm cho localStorage
- 2. Tạo đối tượng ra khỏi ký hiệu chấm
- 3. Nội suy chuỗi Scala trong println - Truy cập các phần tử sử dụng ký hiệu chấm
- 4. javascript đối tượng truy cập hiệu suất
- 5. angular2 elvis toán tử và ký hiệu khung/đối tượng truy cập bằng phím
- 6. Chuyển đổi đối tượng JavaScript phức tạp để đối tượng ký hiệu dấu chấm
- 7. Chỉ định thuộc tính đối tượng trong ký hiệu dấu chấm có biến số
- 8. Truy cập các thuộc tính đối tượng đồ họa bằng cách sử dụng ký hiệu chấm trên các phiên bản Matlab trước R2014b
- 9. Trình chỉ mục TypeScript vẫn nhận được lỗi tslint "truy cập đối tượng qua chuỗi ký tự không được phép"
- 10. Sự khác nhau giữa các ký hiệu Mảng đa chiều (đối tượng [] [] và đối tượng [,])
- 11. Java nhiều đối số ký hiệu dấu chấm - varargs
- 12. Ký hiệu mảng đối tượng jQuery
- 13. Cách truy cập các thuộc tính đối tượng có chứa các ký tự đặc biệt?
- 14. Vấn đề truy vấn JSON Oracle 12c với ký hiệu dấu chấm và dấu ngoặc kép
- 15. Chuyển đổi ký hiệu chữ cho đối tượng thành mảng
- 16. LINQ: ký hiệu dấu chấm tương đương cho THAM GIA
- 17. Nhân bản đối tượng TypeScript
- 18. Truy cập các đối tượng từ một quy trình khác
- 19. phương pháp ký hiệu dấu chấm đối tượng được lập chỉ mục cho thuộc tính vô hướng
- 20. Tự động truy cập các phương thức của lớp TypeScript
- 21. Truy cập các trường từ đối tượng proxy
- 22. Đối tượng truy cập dữ liệu PHP
- 23. Ruby - Truy cập băm đa chiều và tránh truy cập đối tượng nil
- 24. Cách truy cập các đối tượng Window & Document trong Aurelia?
- 25. Truy cập các thuộc tính của một mảng đối tượng
- 26. Truy cập nguyên mẫu đối tượng Javascript
- 27. Truy cập các đối tượng lồng nhau Javascript an toàn
- 28. matlab là gì. ' (dấu chấm) ký hiệu?
- 29. Cách truy cập các phương pháp tĩnh trong TypeScript
- 30. Vô hiệu hóa quyền truy cập đăng ký cho quy trình cụ thể (WinAPI)
Đó là một cảnh báo, nó vẫn cần biên dịch, vì vậy nguyên cảo vẫn là một siêu nghiêm ngặt của JS. Lý do nó cảnh báo bạn là vì TypeScript được gõ, và kiểu 'x' không chỉ định các thuộc tính' bar'. Bạn có thể chuyển sang 'any', áp dụng một giao diện có' bar', hoặc sử dụng '[" bar "]'. –
@Asad: Lỗi được hiển thị và mô tả được báo cáo là lỗi thích hợp, không phải cảnh báo và bản dựng của tôi không thành công. Tuy nhiên, tôi có thể truyền thành 'bất kỳ' thành công. – user655321
TypeScript là cố ý nghiêm ngặt hơn JavaScript, do đó, có nó là hợp pháp trong Javascript không nhất thiết có nghĩa là trình biên dịch TypeScript sẽ đồng ý. –