[typescript] ‘ObjectConstructor’유형에 ‘assign’특성이 없습니다.

함수를 사용하는 응용 프로그램에서 TypeScript를 사용하고 있습니다.

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

그러나 컴파일하는 동안 다음 오류가 발생합니다.

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

이 오류를 어떻게 제거 할 수 있는지 알고 있습니까?



답변

다음 과 같이 type assertion을 사용할 수 있습니다 .

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


답변

구성 :

VS 코드를 사용하는 경우 (또는 tsconfig.json파일이 있는 경우) :

lib속성을 속성에 추가하면 tsconfig.json편집기가 번들로 제공되는 유형 스크립트 유형 정의를 사용하고 지능도 제공합니다.

에 코드 "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을 대상으로하는 경우 타이프 스크립트 컴파일러는 당신을 위해 polyfills을 포함하지 않기 때문에, 당신은 polyfills을 포함해야 함.

폴리 필 (필요한)을 포함하려면 core-js의 폴리 필을 사용하는 것이 좋습니다.

npm install --save core-js

또는

yarn add core-js

그런 다음 앱의 진입 점 (예 🙂 에서 파일 맨 위에 /src/index.ts가져 오기를 추가 core-js하십시오.

import 'core-js';

패키지 관리자를 사용하지 않는 경우 MDN 에서 가져온 다음 polyfill을 사용하기 전에 실행되는 코드의 일부 위치에 붙여 넣을 수 있습니다 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
  });
}


답변

이는 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;
    };
  })();
}


답변

ES6에서와 같이 스프레드 연산자를 사용할 수 있습니다

const obj = {...this.success,...success.json()};


답변

입력을 추가했습니다 :

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


답변

스프레드 연산자를 사용하지 않는 이유는 무엇입니까?


return {this.success, ...success.json() || {}};


답변

나는 이것이 길다는 것을 알고 있지만 여기에 쉬운 해결책이 있습니다.

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