2017-07-31 101 views
9

我正在處理ng2實現。我使用以下函數調用將對象轉換爲數組:屬性「條目」不存在類型'ObjectConstructor'

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

這是一個標準的js函數。然而,TS編譯器返回以下錯誤:基於快速谷歌

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

看來該解決方案可能是改變compilerOptions目標從ES5屬性ES6。然而,以前的一些研究爲先前的問題後,我以爲我是能夠通過包括下面我tsconfig.json額外的「LIB」財產利用ES6功能:

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

我也試圖改變目標屬性到es2015,然後重建項目並執行「typescriptUsingTsConfig」,但我仍然得到相同的錯誤。任何想法,我可以在這裏做的,以利用Object.entries()函數?

回答

16

您完全可以確定,更改target是錯誤的方法,更改lib是正確的方法,但是您指定了錯誤的語言版本。在ES2017規範中正式添加了According to MDN,Object.entries

"lib": ["es2017"] 

因此您必須指定*。

如果你想添加聲明爲 ES2017添加的Object功能的方法,打字稿允許你指定a more granular value

"lib": ["es2017.object"] 

正如亞歷山大·伯德所指出的,在默認情況下,"lib"選項的隱含值取決於爲"target"指定的值(如果存在)。

例如:

"target": "es2017" 

將導致相應前綴"lib.*"到默認除非明確指定"lib"被包括在內。

請注意,您可能希望添加一個實現本身的polyfill,such as the this one,以確保它在較早的運行時中可用。

注:作爲替代,您可以指定

"lib": ["esnext"] 

,其中將包括已知的打字稿語言的最新標準庫功能的聲明。由於它表示一個移動的目標,因此根據目標運行時間填充所有相應的運行時間是一個複雜的任務,需要研究並涉及加載不同的polyfills,因此應謹慎使用此選項。

+0

謝謝阿魯。那就是訣竅。這會得到ie10 +的支持嗎?試圖找出我是否應該添加polyfill – user8334943

+0

@ user8334943不,你肯定需要爲IE 10添加一個polyfill。MDN鏈接在底部有瀏覽器支持信息。 –

+1

其他人的注意事項:如果您沒有使用'lib'編譯器選項,則可能有一個基於您的目標的默認值,當您設置'lib'時將被覆蓋。請參閱[編譯器選項文檔](https://www.typescriptlang.org/docs/handbook/compiler-options.html)以獲取默認列表。我必須爲我的目標以及'es2017.object'顯式地添加默認的'lib'參數。 – alexanderbird

相關問題