함수를 사용하는 응용 프로그램에서 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.json
VS 코드를 다시 시작 하십시오.
{
"compilerOptions": {
// ...
"target": "es5",
"lib": ["esnext", "dom"]
// ...
}
}
모든 tsconfig.json
옵션을 보려면 여기를 클릭하십시오 .
Visual Studio 또는 MSBuild를 사용하는 경우이 태그를 포함하십시오.
<TypeScriptLib>esnext, dom</TypeScriptLib>
모든 MSBuild typescript 컴파일러 옵션 및 사용법은 여기를 참조 하십시오 .
작업 확인 :
내장 유형을 사용하도록 프로젝트를 구성하고 편집기를 다시 시작한 any
경우 다음을 사용할 때 결과 유형이 다음과 같이 표시됩니다 Object.assign
.
폴리 필 및 이전 브라우저 호환성에 대한 참고 사항 :
주 당신이 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())