2015-05-07 18 views
6

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

Property does not exist on type

+3

Đó 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 "]'. –

+0

@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

+0

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 ý. –

Trả lời

0

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 
+0

Đó 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

+0

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

0

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:

enter image description here

HTH

5

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.foox.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.

0

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.

0

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.)

Các vấn đề liên quan