オブジェクトからカンマ区切りの文字列を作成しようとしています、
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'
代わりにObject.keysを使用してください。
const data = {
a: "first",
b: "second",
};
const values = Object.keys(data).map(key => data[key]);
const commaJoinedValues = values.join(",");
console.log(commaJoinedValues);
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 =。
何らかの理由でtsconfigでES7に更新できない場合は、このObject.values
を実行することでTypeScriptで(<any>Object).values(data)
を使用できます。
の代わりに
Object.values(myObject);
つかいます
Object["values"](myObject);
あなたの例の場合:
const values = Object["values"](data).map(x => x.substr(0, x.length - 4));
これはtsコンパイラエラーを隠します。
TypeScriptでこの機能を有効にするためにtsconfig.json
のターゲットを増やしました
{
"compilerOptions": {
"target": "es2017",
......
}
}
CLIとワークスペースを使用してAngular 6でng g library foo
を使用してライブラリを作成することで、この問題を解決できました。
私の場合、問題はlib
セクションにtsconfig.lib.json
が含まれていなかったlibraryフォルダーのes2017
にありました。
Angular 6を使ってこの問題に遭遇した人は、tsconfig.lib.json
だけでなくあなたのアプリケーションtsconfig.json
も必ず更新してください
ここで私のtslint
ルールを設定することで、常にObject["values"](myObject)
行をObject.values(myObject)
に置き換えます。
同じ問題がある場合、2つの選択肢があります。
(Object as any).values(myObject)
または
/*tslint:disable:no-string-literal*/
`Object["values"](myObject)`