Object.entries() и Object.values() не типизируются как массивы в WebStorm/PhpStorm.

У меня есть проект TypeScript с целью ES6, он использует core-js для полифила функций ES2017, и tsconfig.json настроен соответствующим образом.

Когда используются Object.entries(...) и Object.values(...), результаты не имеют методов и свойств массива (map, forEach, length и т. д.), они отображаются в IDE как простые объекты, поэтому тип any[] должен быть приведен явно:

Пока Object.keys(...) ведет себя как надо.

При этом IDE каким-то образом "знает" о правильных типах для Object.entries и Object.values, они отображаются в соответствии с TypeScript'овским lib.es2017.object.d.ts по Ctrl+Shift+P. Но, похоже, игнорируются типы для проверки, потому что переопределение ObjectConstructor в текущем файле решает проблему:

interface ObjectConstructor {
    values(o: any): any[];
    entries(o: any): [string, any][];
}

tsc, кажется, нормально печатает, так что это похоже на проблему, специфичную для IDE.

Это происходит только тогда, когда Use TypeScript service в Languages & Frameworks > TypeScript снят флажок. Все идет нормально, когда включена служба TypeScript (она отключена намеренно, так как раньше были проблемы со службой TS).

Вот tsconfig.json:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "alwaysStrict": true,
    "strictNullChecks": false,
    "baseUrl": "./src",
    "paths": [],
    "lib": [
      "es2016",
      "es2017.object"
    ]
  },
  "exclude": [
    "node_modules"
  ]
}

Что это значит? Мои настройки где-то пошли не так?

Проблема сохраняется с TypeScript 2.1.5 и последней версией IDE (EAP 2017.1).


person Estus Flask    schedule 01.02.2017    source источник
comment
обязательно обновитесь до последней версии TypeScript. Используемая вами версия старше 1 года   -  person Poul Kruijt    schedule 02.02.2018
comment
Ну и вопрос годовалой давности тоже. Проблема исчезла для меня в какой-то момент, но я так и не понял, связано ли это с обновлением TS или IDE.   -  person Estus Flask    schedule 02.02.2018
comment
Удивительно, это научит меня не читать правильно. Я очень рад, что ваша проблема была решена, и я надеюсь, что когда-нибудь вы найдете ответ на то, что было не так. А пока мы в темноте   -  person Poul Kruijt    schedule 02.02.2018


Ответы (2)


В Typescript 2.3 появилась новая поддержка итераторов флаг компилятора --downlevel-iteration или установив .compilerOptions.downlevelIteration в true в файле tsconfig.json.

Обратите внимание, что этот ответ совпадает с этим, поскольку он относится к тому же флагу компилятора и аналогичным симптомам, даже если один относится к проблемам с компилятором, а этот о какой-то интеграции с IDE.

person svvac    schedule 02.02.2018

перейдите в свой tsconfig.json и измените цель, библиотеку и модуль на es2017.

person Abhishek Parashar    schedule 20.09.2019