プロパティ 'assign'はタイプ 'ObjectConstructor'に存在しません


130

アプリケーションでTypeScriptを使用していますが、関数を使用しています。

Object.assign(this.success, success.json())

しかし、コンパイル中に次のエラーが表示されます。

 error TS2339: Property 'assign' does not exist on type 'ObjectConstructor'.

このエラーをどのようにして取り除くことができるか、ご存知ですか?


承認された回答を変更することを検討してください-それ以降、より多くの賛成票を持つより良い回答が投稿されています。
— mindplay.dk

回答:


129

次のように、型アサーションを使用できます。

(<any>Object).assign(this.success, success.json())

30
うわー、超ハックらしいです。(<any> Object)が何をするのか説明してもらえますか?
— uksz 2016年

さて、Objectの型がanyであることを宣言しているのがわかります。
— uksz 2016年

31
これは解決策のように見えますが、実際には1つとして扱われるべきではありません。むしろ、あいまいさを追加してトランスパイラーエラーを非表示にします(これは実際に行われます)。実際にそれらを修正して、コンソールから有用なフィードバックを得る方がはるかに優れています。
— Dmitry Parzhitsky

6
これは問題をキャストして非表示にするだけです。特定のブラウザなどで潜在的にポリフィルを使用する必要があります。これにより、一部のブラウザでエラーが発生します
— Tom McKearney

3
ここを探している人は少し下にスクロールして、これに何を追加するかを説明することをお勧めします。tsconfigこれはこれよりも優れたソリューションです。
— mesqueeb

175

構成、設定:

VSコードを使用している場合(またはtsconfig.jsonファイルが表示されている場合):

libプロパティをに追加する必要があります。tsconfig.jsonそうすると、エディタはバンドルされたtypescriptタイプ定義を使用し、インテリセンスも提供します。

をに追加し"lib": ["esnext", "dom"]てtsconfig.jsonVSコードを再起動するだけです

{
    "compilerOptions": {
        // ...
        "target": "es5",
        "lib": ["esnext", "dom"]
        // ...
    }
}

ここですべてのtsconfig.jsonオプションを参照してください。

Visual StudioまたはMSBuildを使用している場合は、次のタグを含めます。

<TypeScriptLib>esnext, dom</TypeScriptLib>

すべてのMSBuild typescriptコンパイラオプションと使用法については、こちらをご覧ください。


あなたの仕事をチェックしてください:

組み込み型を使用するようにプロジェクトを構成し、エディターを再起動した場合、結果の型は、any使用時の型ではなく、次のようになりますObject.assign。

コード例1


ポリフィルと古いブラウザの互換性に関する注意:

注あなたは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
  });
}

2
"lib":["es2015"、 "es2017"、 "dom"]を試しましたが、タイプ 'ObjectConstructor'にプロパティ 'values'が存在しません。、私はそれが仕様に含まれていないと思います
— ニコス


万が一WebStormであなたにエラーになる場合は、Javascript.nextをインストールする必要があり、ここでプラグイン:plugins.jetbrains.com/plugin/...
— ニコラBouletさん-Lavoie

tsconfig.jsonを変更することが、私にとって有効な唯一の回避策です。つまり、追加"lib": [ "es2015", "es2017", "dom" ]
— Danny Sofftie

2
@AQuirkyこのTypeScriptTargetオプションは、EmcaScriptのターゲットバージョンを変更します(〜正式なJavaScript名)。ES2015参考:IE11には対応していません(サポートする必要がある場合)。あなたはまだ設定できるTypeScriptTargetにES5も設定しているときTypeScriptLibにDOM, ES2015も、IE11との互換性を保ちながら、同じ修正を達成するために(しかし、あなたはその後、ちょうど設定IE、サポートするために持っていない場合TypeScriptTarget にはES2015)。
— Rico Kahler、2018

128

これは、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;
    };
  })();
}

5
@JoeKeeneこの回答は、TS 2.0+の場合と同じように問題を解決するものではありません。ES5をターゲットにしている場合は、--lib es2015コンパイラオプションを使用する必要があります。上記のアプローチと私の問題は、あなたの場合ということである代わりに、組み込みの宣言を使用しての機能は、あなたが正しいタイピングとドキュメントを取得することはできません。彼らはオプションを追加したので、すでに標準の一部であるインターフェースを再宣言する必要はありません。declareObject.assign--lib
— Rico Kahler 2017

これが機能するためには.d.ts、typescript(.ts)ファイルではなく、typings()ファイルにインターフェイス宣言を追加する必要がありました。
— Mike Chamberlain

@ukszおそらくこれはハッキリではないので、受け入れるべきでしょうか?
— Jason

に変わり"target": "es5",まし"target": "es6",たtsconfig.json。(y)
— theapache64 2018年

1
の場合Object.values、これはでなければなりません"target": "es2017"。これは、同じエラーコードの上位の検索結果だからです。
— NobleUplift


1

タイピングを追加しました:

typings install dt~es6-shim --global --save

1
私が返信したものと同じタイプのように見えますか?または、何か不足していますか?
— Sergejs 2017年


-1

私はこれが長いことを知っていますが、ここに簡単な修正があります

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