2017-07-31 26 views
9

Tôi đang làm việc trên một thực hiện ng2. Tôi đang sử dụng lệnh gọi hàm sau để chuyển đổi đối tượng thành mảng:Thuộc tính 'mục' không tồn tại trên loại 'ObjectConstructor'

var authors = Object.entries(responseObject.Authors); 

Đây là hàm js chuẩn. Tuy nhiên, trình biên dịch ts trả về lỗi sau:

"Property 'entries' does not exist on type 'ObjectConstructor'" 

Dựa trên google nhanh chóng có vẻ là giải pháp có thể để thay đổi compilerOptions nhắm mục tiêu bất động sản từ ES5 để es6. Tuy nhiên, sau khi một số nghiên cứu trước đây cho một vấn đề trước đó, tôi nghĩ rằng tôi đã có thể tận dụng chức năng es6 bằng cách bao gồm các bổ sung "lib" tài sản trên tsconfig.json của tôi dưới đây:

"compilerOptions": { 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "module": "commonjs", 
    "noEmitOnError": true, 
    "noImplicitAny": false, 
    "outDir": "../Scripts/", 
    "removeComments": false, 
    "sourceMap": true, 
    "target": "es5", 
    "moduleResolution": "node", 
    "lib": [ 
     "es2015", 
     "dom" 
    ] 
    } 

Tôi cũng đã cố gắng thay đổi thuộc tính target để es2015 và sau đó xây dựng lại dự án và thực hiện "typescriptUsingTsConfig" nhưng tôi vẫn nhận được lỗi tương tự. Bất kỳ ý tưởng những gì tôi có thể làm ở đây để tận dụng các chức năng Object.entries()?

Trả lời

16

Bạn hoàn toàn chính xác khi thay đổi target là cách tiếp cận sai và thay đổi lib là cách tiếp cận chính xác, tuy nhiên bạn đã chỉ định phiên bản sai của ngôn ngữ. According to MDN, Object.entries đã được thêm chính thức vào đặc tả ES2017.

"lib": ["es2017"] 

do đó bạn phải chỉ định thay thế *.

Nếu bạn muốn thêm chỉ tờ khai cho các phương pháp của Object chức năng đã được thêm vào trong ES2017, nguyên cảo phép bạn chỉ định a more granular value

"lib": ["es2017.object"] 

Theo ghi nhận của Alexander Bird, theo mặc định , giá trị tiềm ẩn của tùy chọn "lib" phụ thuộc vào giá trị được chỉ định cho "target" nếu có.

Ví dụ:

"target": "es2017" 

sẽ gây ra tương ứng tiền tố "lib.*" để được bao gồm theo mặc định trừ "lib" được quy định một cách rõ ràng.

Lưu ý rằng bạn có thể sẽ muốn thêm một phần của bản thân việc triển khai, such as the this one, để đảm bảo điều này hoạt động trong các thời gian chạy cũ hơn.

Lưu ý: như một sự thay thế, bạn có thể chỉ định

"lib": ["esnext"] 

Mà sẽ bao gồm tờ khai cho các tính năng thư viện tiêu chuẩn mới nhất được biết đến với ngôn ngữ nguyên cảo. Vì nó đại diện cho một mục tiêu di động, nên sử dụng tùy chọn này cẩn thận vì việc thực hiện tất cả các thời gian chạy tương ứng là định nghĩa một nhiệm vụ phức tạp sẽ yêu cầu nghiên cứu và liên quan đến việc tải các polyfills khác nhau tùy thuộc vào thời gian chạy đích của bạn.

+0

cảm ơn aluan. điều đó có hiệu quả. điều này có được hỗ trợ bởi ie10 + không? cố gắng để tìm ra hay không tôi nên thêm một polyfill – user8334943

+0

@ user8334943 không có bạn chắc chắn sẽ cần một polyfill cho IE 10.Liên kết MDN có thông tin hỗ trợ trình duyệt ở dưới cùng. –

+1

Lưu ý cho những người khác: nếu bạn không sử dụng tùy chọn trình biên dịch 'lib', có thể có một giá trị mặc định dựa trên mục tiêu của bạn sẽ bị ghi đè khi bạn đặt' lib'. Xem [tài liệu tùy chọn trình biên dịch] (https://www.typescriptlang.org/docs/handbook/compiler-options.html) để biết danh sách các giá trị mặc định. Tôi đã phải thêm các tham số 'lib' mặc định cho mục tiêu của mình cũng như' es2017.object'. – alexanderbird

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