web-dev-qa-db-ja.com

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

TypeScriptでこれを行う方法

エラーファイルを取得する:

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

代わりにObject.keysを使用してください。

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

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

const commaJoinedValues = values.join(",");
console.log(commaJoinedValues);
77
holi-java

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

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

たとえば、tsconfig.jsonを使用する場合:

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

TypeScriptでES2017をターゲティングすると、notES2017のブラウザーでポリフィルが放出されることに注意してくださいcompileエラーですが、ブラウザはES2017 Object.valuesを実装していないため、runtimeエラーが発生する可能性があります。必要に応じて、プロジェクトコードを自分でポリフィルする必要があります。そして Object.valuesはまだすべてのブラウザーで十分にサポートされていない (この記事の執筆時点では)間違いなくポリフィルが必要です: core-js will do the job =。

184
Aaron Beall

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

14
mtpultz

の代わりに

Object.values(myObject);

つかいます

Object["values"](myObject);

あなたの例の場合:

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

これはtsコンパイラエラーを隠します。

11
Kian

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

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

CLIとワークスペースを使用してAngular 6でng g library fooを使用してライブラリを作成することで、この問題を解決できました。

私の場合、問題はlibセクションにtsconfig.lib.jsonが含まれていなかったlibraryフォルダーのes2017にありました。

Angular 6を使ってこの問題に遭遇した人は、tsconfig.lib.jsonだけでなくあなたのアプリケーションtsconfig.jsonも必ず更新してください

4
Neil Stevens

ここで私のtslintルールを設定することで、常にObject["values"](myObject)行をObject.values(myObject)に置き換えます。

同じ問題がある場合、2つの選択肢があります。

(Object as any).values(myObject)

または

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