Подтвердить что ты не робот

Использование TypeScript и Object.assign дает мне ошибку "свойство" присваивать "не существует в типе" ObjectConstructor ""

Я пишу свой вопрос снова, потому что раньше он не имел никакого смысла, и я был не очень ясен.

Я получаю данные от API, который выглядит примерно так:

{"photos":[{"id":1,"title":"photo_1_title"}]}

Итак, в моем коде у меня есть переменная photos, а метод под названием getPhotos()

Я использую бесконечный прокрутки, поэтому, когда я добираюсь до нижней части страницы, я снова вызываю getPhotos().

photos: any;

getPhotos() {
  this.photoService.getPhotos()
    .subscribe(
      photos => this.photos = photos
      // here, instead of doing this, I want to add the array of photos I get back to this.photos using Object.assign however it is giving me the said error
    )
}

Итак, если в следующий раз я его вызову, я вернусь {"photos":[{"id":2,"title":"photo_2_title"}]}, тогда я пытаюсь установить this.photos как

{"photos":[{"id":1,"title":"photo_1_title"}, {"id":2,"title":"photo_2_title"}]}

может кто-нибудь помочь мне, почему jsfiddle.net/ca46hLw9 не работает? Я думал, что присваивание должно объединить содержимое объекта вместе?

4b9b3361

Ответ 1

Object.assign является функцией ECMAScript2015 и не существует в ECMAScript5 и ниже.

Скорее всего, вы планируете компилировать свой Typescript для ECMAScript5, и поэтому интерфейс Object не имеет assign.

Вы можете либо указать ECMAScript2015, изменив конфигурацию компилятора TS с помощью

target: 'es6'

или вы можете расширить интерфейс ObjectConstructor с помощью метода assign

declare interface ObjectConstructor {
    assign(...objects: Object[]): Object;
}

(вы можете добавить это объявление в любом месте, повторное использование интерфейса расширяет его, а не перезаписывает его)

Или вы можете принудить Object к any и игнорировать его ввод:

(<any>Object).assign( this.photos, photos )

Какой бы вы ни выбрали, имейте в виду, что если вы хотите, чтобы это выполнялось в старых браузерах, вам нужно добавить polyfill. Большинство современных браузеров довольно близки к реализации набора функций ES2015, но они не на 100% там, а это означает, что некоторые части вашего кода все равно будут терпеть неудачу, если вы будете полагаться на функциональность ES2015.

Typescript не будет polyfill Object.assign при настройке ES5 или старше, поэтому вы получаете эту ошибку. С другой стороны, у Babel есть полиполки в виде плагинов, что означало бы, что вам нужно включить трансляцию в Babel в ваш конвейер сборки, см. https://babeljs.io/docs/plugins/transform-object-assign/ p >

В качестве окончательного варианта вы можете использовать библиотеку как Lodash или jQuery, которые имеют собственную реализацию Object.assign (называемой extend)

Ответ 2

С Typescript 2.1 или новее вы можете использовать синтаксис распространения объекта.

let obj = { x: 1, y: "string" };
var newObj = {...obj, z: 3, y: 4}; // { x: number, y: number, z: number }

Порядок указания операций распространения определяет, какие свойства в конечном итоге в результате объекта; свойства в более поздних спредах "выигрывают", поверх ранее созданных свойств.

Ответ 3

Для машинописной версии 2.0 или выше просто измените файл tsconfig.json таким образом, чтобы раздел "lib" содержал "es6":

"lib": [
  "es5",
  "es6",
  "dom",
  "es2015.collection"
]