Клиент Fetch, у которого возникла проблема с назначением массива JSON

В документах клиента выборки Aurelia есть базовый пример получения данных json:

bind() {
    let client = new HttpClient();

    return client.fetch('data.json')
        .then(response => response.json())
        .then(data => {
            console.log(data[1]);
        });
}

Вышеупомянутое работает нормально, но следующее не работает:

files = [];

bind() {
    let client = new HttpClient();

    return client.fetch('data.json')
        .then(response => response.json())
        .then(files => this.files = files);
}

Gulp теперь жалуется на «ошибка TS2322: тип« Ответ »не может быть назначен типу« любой [] »».

Еще более странно то, что теперь я получаю ошибки XHR 404 в своей консоли. Это не имеет никакого смысла; у файла data.json не было проблем с поиском и извлечением в первый раз. Единственная разница во втором фрагменте кода заключается в том, что вместо того, чтобы выводить данные в консоль, я на самом деле пытаюсь что-то с ними сделать.


person 8protons    schedule 19.10.2017    source источник
comment
@Fenton Спасибо за комментарий. У меня довольно много зависимостей в моем package.json, чем бы я хотел поделиться? Я не думаю, что они все поместятся в этом комментарии.   -  person 8protons    schedule 19.10.2017
comment
Похоже, что files имеет тип Response, который не может быть назначен any[], который является типом this.files, который вы установили с помощью files = [];. Вы можете использовать (files: any) => или изучить, как работать с ответами от HttpClient, чтобы использовать соответствующие типы.   -  person Explosion Pills    schedule 19.10.2017
comment
@Fenton Я все еще могу предоставить его, если хотите, но Explosion Pills решили эту проблему. Код, который я эмулировал, был точной копией документации плагина Aurelia-Table, которая, как мне кажется, работала без проблем в то время, но не сейчас. Если вам интересно, загляните в заголовок «Основы», перейдите на вкладку JS: tochoromero.github.io/ aurelia-стол   -  person 8protons    schedule 19.10.2017
comment
@ExplosionPills Вау! Большое спасибо!!! Если хотите, добавьте свой комментарий в ответ, чтобы мы могли заблокировать эти вопросы и ответы для других, которые могут застрять на этом. До сих пор я обращался к нескольким другим людям, которые были в тупике.   -  person 8protons    schedule 19.10.2017
comment
На самом деле я не могу воспроизвести вашу проблему... какую версию TypeScript вы используете?   -  person Explosion Pills    schedule 19.10.2017
comment
Машинопись @ExplosionPills: 2.1.1   -  person 8protons    schedule 19.10.2017


Ответы (1)


Я полагаю, что ваша конкретная проблема может быть вызвана более старой версией TypeScript (2.1, последняя — 2.5). Если у вас есть возможность сделать это, вы можете попробовать обновить его.

response в операторе response => относится к типу Response, определенному Aurelia. Когда вы запускаете this.files = files, кажется, что TypeScript считает, что files относится к типу Response. Вы уже неявно объявляете this.files как тип any[], поэтому присвоение не разрешено.

Вы можете обойти это, установив явный тип для files или даже просто используя any:

.then((files: any[]) => this.files = files);

Я бы попытался избежать использования any, чтобы обойти безопасность типов и работать с типами, но проблема, с которой вы столкнулись, похоже, является ошибкой в ​​используемой вами версии TypeScript и/или Aurelia.

person Explosion Pills    schedule 19.10.2017