2017-03-23 153 views
18

我想備考逗號從物體隔開的字符串,如何在打字稿中使用Object.values?

const data = {"Ticket-1.pdf":"8e6e8255-a6e9-4626-9606-4cd255055f71.pdf","Ticket-2.pdf":"106c3613-d976-4331-ab0c-d581576e7ca1.pdf"}; 
const values = Object.values(data).map(x => x.substr(0, x.length - 4)); 
const commaJoinedValues = values.join(','); 
console.log(commaJoinedValues); 

如何使用打字稿做到這一點?

得到一個錯誤文件:使用Object.keys代替

severity: 'Error' 
message: 'Property 'values' does not exist on type 'ObjectConstructor'.' 
at: '216,27' 
source: 'ts' 

回答

6

const data = {"Ticket-1.pdf":"8e6e8255-a6e9-4626-9606-4cd255055f71.pdf","Ticket-2.pdf":"106c3613-d976-4331-ab0c-d581576e7ca1.pdf"}; 
const values = Object.keys(data).map(key=>data[key]).map(x => x.substr(0, x.length - 4)); 
const commaJoinedValues = values.join(','); 
console.log(commaJoinedValues); 
+7

請注意,這是一個替代方案(很好!),而不是關於如何在TS中使用ES7的Object.values來解決OP的編譯錯誤的實際答案。要做到這一點,只需在'--lib'設置中使用'ES2017'。 – Aaron

+0

@Aaron你的解決方案非常複雜,以至於任何新的打字稿都無法接受,爲了編譯你必須添加'ES2017'庫,並且必須包含使用它的polyfill庫。對不同人的不同答案是國王。 –

+1

@ holi-jave這不是「我的解決方案」,它只是TS和非標準JS功能的工作方式,就像OP試圖使用ES7/Object.values()一樣。也許你認爲它的複雜性(我並不反對),但這只是嘗試今天使用'Object.values()'等未來特性的本質。它總是這樣。即使'Object.keys()'仍然應該是多邊填充的,如果你的目標是ES3或者想支持IE8(希望你現在不用了!)如果你是ESB,那麼通常理解ES特性,瀏覽器支持和polyfilling是個好主意。在網站開發中! – Aaron

45

Object.values()part of ES2017,和你所得到的編譯錯誤是因爲你需要TS配置爲使用ES2017庫。您可能正在使用當前TS配置中的ES6或ES5庫。

解決方法:在您的--lib compiler option中使用es2017es2017.object

例如,使用tsconfig.json

"compilerOptions": { 
    "lib": ["es2017", "dom"] 
} 

注意與打字稿目標ES2017確實發出在瀏覽器polyfills爲ES2017,它給你做,在你的項目自己,如果你想。而且由於Object.values is not yet well supported by all browsers你絕對想要一個polyfill:core-jsdo the job

+0

@ErikvanVelzen您編輯了「ES2017」更改爲「es2017」的答案,但AFAIK這不是必須的,但我總是想學習,是否有變化的原因? – Aaron

+0

^回答我自己的問題:'ES2017','DOM'(大寫)在'tsc --init'註釋中被列爲有效值並且它在編譯器中正常工作,但[JSON模式](https: //github.com/SchemaStore/schemastore/blob/master/src/schemas/json/tsconfig.json)只枚舉'es2017','dom'(小寫)選項,所以JSON IDE/linter會標記'ES2017', 'DOM'作爲無效值(即使它們是有效的)。有點混亂。 – Aaron

+0

的確是這個原因。它會按照大寫字母大寫。 'tsc --help'顯示小寫雖然 –