typescriptでObject.valuesを使用する方法


135

オブジェクトからカンマ区切りの文字列を作成しようとしていますが、

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

TypeScriptでこれを行う方法

エラーファイルの取得:

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

回答:


106

代わりにObject.keysを使用します。

const data = {
  a: "first",
  b: "second",
};

const values = Object.keys(data).map(key => data[key]);

const commaJoinedValues = values.join(",");
console.log(commaJoinedValues);

90
これは代替手段(良い方法です!)であり、Object.valuesTSでES7を使用してOPのコンパイルエラーを解決する方法についての実際の回答ではないことに注意してください。あなたは、単に必要なことを行うにはES2017、あなたの中に--lib設定。
アーロンビール2017年

4
@Aaronのソリューションは非常に複雑なので、typescriptをES2017初めて使う人は受け入れられません。コンパイルするには、libを追加し、それを使用するpolyfillsライブラリを含める必要があります。さまざまな人々に対してさまざまな答えを与えることが重要です。
holi-java 2017

9
@ holi-jave OPがを使用しようとした場合のように、TSと非標準のJS機能がどのように機能するかは、「私の解決策」ではありませんES7/Object.values()。多分あなたはその複雑さを考えます(私は同意しません)が、それはObject.values()今日のような将来の機能を使おうとする性質にすぎません。それは常にこの方法でした。でもObject.keys()あなたはES3をターゲットまたはIE8をサポートしたいた場合は、まだ(うまくいけば、あなたはもうない!)polyfilledしなければならないことは、ES特徴、ブラウザのサポート、そしてあなたがWeb開発にある場合polyfillingを理解するために、一般的に良いアイデアです!
アーロンBeall 2017年

@Aaron私はそれが複雑だとは言いませんが、typescript / javascriptを初めて使う人にとってはもっと複雑で、受け入れられません。
holi-java 2017


223

Object.values()あるES2017の一部、とあなたはES2017ライブラリを使用するようにTSを設定する必要がありますので、あなたが取得しているコンパイルエラーです。現在のTS構成でES6またはES5ライブラリを使用している可能性があります。

解決策:es2017またはes2017.object--libコンパイラオプションで使用します

たとえば、次のように使用しtsconfig.jsonます。

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

活字体とES2017を標的にすることに注意ではない ES2017用のブラウザでpolyfillsを発する(あなたの上記のように解きを意味し、コンパイルエラー、しかし、あなたはまだ発生する可能ランタイムブラウザはES2017を実装していないため、エラーがObject.values)、それはあなたのプロジェクトをポリフィルするのはあなた次第です必要に応じて、自分でコーディングします。また、(この記事の執筆時点では)Object.valuesすべてのブラウザーでまだ十分にサポートされていないため、確実にポリフィルcore-js必要です


1
@ErikvanVelzen toのケースを変更するために回答を編集しES2017ましたes2017が、AFAIKは必要ではありませんが、常に学びたいので、変更の理由はありましたか?
Aaron Beall

2
:^自分の質問に答えるためにES2017DOM中にリストされている(大文字の)tsc --init有効な値としてコメント、それは、コンパイラで正しく動作しますが、JSONスキーマはのみ列挙しes2017domJSON IDE /リンター意志フラグので、(小文字)オプションをES2017DOMと無効な値(有効であっても)。少し混乱します。
Aaron Beall

確かにそれが理由でした。お気づきのように大文字で動作します。tsc --helpただし、小文字で表示
Erik van Velzen

core-jsはAngularに含まれていませんか?
サミウラカーン

1
@ Totty.js TSに含まれるライブラリファイルは、型チェックのみを目的としています。つまり、実際には、JSライブラリのポリフィルを出力しませんObject.values()。つまり、コンパイルエラーを回避することができますが、を持たないブラウザで実行すると、ランタイムエラーが発生しますObject.values()
アーロンビール

18

何らかの理由でtsconfigでES7に更新できない場合はObject.values、TypeScriptで使用できます(<any>Object).values(data)


4
@Aaronの投稿時に、Angularの特定のバージョンを使用しているユーザーが、機能していないlibの更新に問題があったことを示すコメントがありました。私は置く理由であるif for some reason you can't update to ES7 in tsconfig
mtpultz

11

の代わりに

Object.values(myObject);

使用する

Object["values"](myObject);

あなたの例の場合:

const values = Object["values"](data).map(x => x.substr(0, x.length - 4));

これにより、tsコンパイラエラーが非表示になります。


1
you are genius(^-')b
harufumi.abe

タイプ 'ObjectConstructor'にはインデックスシグネチャがないため、要素は暗黙的に 'any'タイプになります
。ts

6
これはTSの誤用です。lib意図的にコンパイラーをエスケープするのではなく、使用方法を反映する設定でコンパイラーを構成する必要があります。
アーロンBeall

1
@AaronBeallそれはあなたがes2017にアップグレードカント何らかの理由であれば良いの使用です
ディノ

@Dino es2017にアップグレードする必要はありません。core -jsを使用してES5までポリフィルできます。TypeScriptにはランタイムがありませんlib。正しい型チェックを取得するための設定です。
アーロンBeall

11

tsconfig.jsonTypeScriptでこの機能を有効にするためにターゲットを増やしました

{
    "compilerOptions": {
        "target": "es2017",
        ......
    }
}

古いブラウザとの互換性を維持したい場合、ターゲットの変更は解決策ではありません。TypescriptはES2017構文をES2015に変換できる必要があります。
ランダムな

4

CLIとワークスペースを使用してAngular 6でこの問題にぶつかっただけで、を使用してライブラリを作成しましたng g library foo

私の場合、問題はセクションに含まれてtsconfig.lib.jsonいないライブラリフォルダーにありes2017ましたlib

Angular 6でこの問題に遭遇した人はtsconfig.lib.json、あなたとあなたのアプリケーションを確実に更新する必要がありますtsconfig.json


ts2017をtsconfig.libとtsconfig.jsonの両方に入れましたが、エントリを使用しようとすると、「オブジェクトにオブジェクトが存在しません」というエラーが表示されます。他に変更/更新する必要があるものはありますか?
モーリス

tsconfig.libのターゲットをes2017に変更しましたが、同じエラーが発生します。
モーリス

2

私の持ってtslint常にラインを交換するここでのルールの設定をObject["values"](myObject)してObject.values(myObject)

同じ問題がある場合の2つのオプション:

(Object as any).values(myObject)

または

/*tslint:disable:no-string-literal*/
`Object["values"](myObject)`

1
なぜあなたは使いたいのObject["values"]ですか?
アーロンBeall

-4

最も簡単な方法は、次のようにtoをキャストするObjectことanyです。

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

そして出来上がり–コンパイルエラーはありません;)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.