アプリケーションでTypeScriptを使用していますが、関数を使用しています。
Object.assign(this.success, success.json())
しかし、コンパイル中に次のエラーが表示されます。
error TS2339: Property 'assign' does not exist on type 'ObjectConstructor'.
このエラーをどのようにして取り除くことができるか、ご存知ですか?
アプリケーションでTypeScriptを使用していますが、関数を使用しています。
Object.assign(this.success, success.json())
しかし、コンパイル中に次のエラーが表示されます。
error TS2339: Property 'assign' does not exist on type 'ObjectConstructor'.
このエラーをどのようにして取り除くことができるか、ご存知ですか?
回答:
次のように、型アサーションを使用できます。
(<any>Object).assign(this.success, success.json())
tsconfigこれはこれよりも優れたソリューションです。
tsconfig.jsonファイルが表示されている場合):libプロパティをに追加する必要があります。tsconfig.jsonそうすると、エディタはバンドルされたtypescriptタイプ定義を使用し、インテリセンスも提供します。
をに追加し"lib": ["esnext", "dom"]てtsconfig.jsonVSコードを再起動するだけです
{
"compilerOptions": {
// ...
"target": "es5",
"lib": ["esnext", "dom"]
// ...
}
}
ここですべてのtsconfig.jsonオプションを参照してください。
<TypeScriptLib>esnext, dom</TypeScriptLib>
すべてのMSBuild typescriptコンパイラオプションと使用法については、こちらをご覧ください。
組み込み型を使用するようにプロジェクトを構成し、エディターを再起動した場合、結果の型は、any使用時の型ではなく、次のようになりますObject.assign。
注あなたはES5以下にtranspilingされ、IE11をターゲットにしている場合はtypescriptですコンパイラはあなたのためのpolyfillsは含まれませんので、あなたがpolyfillsを含める必要があること。
ポリフィルを含める場合(必要な場合)、core-jsのポリフィルを使用することをお勧めします。
npm install --save core-js
または
yarn add core-js
次に、アプリのエントリポイント(など/src/index.ts)core-jsで、ファイルの先頭にのインポートを追加します。
import 'core-js';
パッケージマネージャーを使用していない場合は、MDNから取得した次のポリフィルを、の使用前に実行されるコードのどこかに貼り付けることができますObject.assign。
if (typeof Object.assign != 'function') {
// Must be writable: true, enumerable: false, configurable: true
Object.defineProperty(Object, "assign", {
value: function assign(target, varArgs) { // .length of function is 2
'use strict';
if (target == null) { // TypeError if undefined or null
throw new TypeError('Cannot convert undefined or null to object');
}
var to = Object(target);
for (var index = 1; index < arguments.length; index++) {
var nextSource = arguments[index];
if (nextSource != null) { // Skip over if undefined or null
for (var nextKey in nextSource) {
// Avoid bugs when hasOwnProperty is shadowed
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
}
}
}
return to;
},
writable: true,
configurable: true
});
}
Object.values仕様にあります。そしてtypescriptはそれのためのタイピングを持っています。
"lib": [ "es2015", "es2017", "dom" ]
TypeScriptTargetオプションは、EmcaScriptのターゲットバージョンを変更します(〜正式なJavaScript名)。ES2015参考:IE11には対応していません(サポートする必要がある場合)。あなたはまだ設定できるTypeScriptTargetにES5も設定しているときTypeScriptLibにDOM, ES2015も、IE11との互換性を保ちながら、同じ修正を達成するために(しかし、あなたはその後、ちょうど設定IE、サポートするために持っていない場合TypeScriptTarget にはES2015)。
これは、ECMAScript 6機能を使用していて、ECMAScript 5または3をターゲットにしていることが原因です。たとえば、Gruntを使用している場合は、適切なターゲットを設定するのが最も簡単な修正です。
options: {
target: 'es6'
}
Visual Studioで関連するプロパティタブを変更する方法、または.csprojファイルを編集してTypeScriptTarget要素を検索し、ES6に変更することで手動で変更する方法:
<TypeScriptTarget>ES6</TypeScriptTarget>
ES5をターゲットにする必要がある場合は、TypeScriptコードに以下を追加するだけです。
declare interface ObjectConstructor {
assign(target: any, ...sources: any[]): any;
}
これで追加のメソッドがマージされ、問題が解決します。詳細はこちら。ただし、ブラウザの互換性要件によっては、ポリフィルが必要になる場合があります。たとえば、MDNのポリフィルなどです。
if (typeof Object.assign != 'function') {
(function () {
Object.assign = function (target) {
'use strict';
if (target === undefined || target === null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var output = Object(target);
for (var index = 1; index < arguments.length; index++) {
var source = arguments[index];
if (source !== undefined && source !== null) {
for (var nextKey in source) {
if (source.hasOwnProperty(nextKey)) {
output[nextKey] = source[nextKey];
}
}
}
}
return output;
};
})();
}
--lib es2015コンパイラオプションを使用する必要があります。上記のアプローチと私の問題は、あなたの場合ということである代わりに、組み込みの宣言を使用しての機能は、あなたが正しいタイピングとドキュメントを取得することはできません。彼らはオプションを追加したので、すでに標準の一部であるインターフェースを再宣言する必要はありません。declareObject.assign--lib
.d.ts、typescript(.ts)ファイルではなく、typings()ファイルにインターフェイス宣言を追加する必要がありました。
"target": "es5",まし"target": "es6",たtsconfig.json。(y)
Object.values、これはでなければなりません"target": "es2017"。これは、同じエラーコードの上位の検索結果だからです。
ES6と同様に、スプレッド演算子を使用できます
const obj = {...this.success,...success.json()};
タイピングを追加しました:
typings install dt~es6-shim --global --save
私はこれが長いことを知っていますが、ここに簡単な修正があります
(Object as any).assign(this.success, success.json())