Я пытаюсь сформировать строку, разделенную запятыми, из объекта,
const data = {"Ticket-1.pdf":"8e6e8255-a6e9-4626-9606-4cd255055f71.pdf","Ticket-2.pdf":"106c3613-d976-4331-ab0c-d581576e7ca1.pdf"};
const values = Object.values(data).map(x => x.substr(0, x.length - 4));
const commaJoinedValues = values.join(',');
console.log(commaJoinedValues);
Как это сделать с помощью TypeScript?
получить файл ошибки:
severity: 'Error'
message: 'Property 'values' does not exist on type 'ObjectConstructor'.'
at: '216,27'
source: 'ts'
typescript
object
user2280016
источник
источник
Object.values
в TS для решения ошибки компиляции OP. Для этого вам просто нужноES2017
в--lib
настройках.ES2017
библиотеку lib и включить библиотеку polyfills, где ее используете.ES7/Object.values()
. Может быть, вы думаете, что это сложно (я не согласен), но это просто природа попыток использовать будущие функции, какObject.values()
сегодня. Это всегда было так. ДажеObject.keys()
если вы нацелены на ES3 или хотите поддерживать IE8 (надеюсь, вы больше этого не сделаете!), В общем, неплохо понимать функции ES, поддержку браузера и полифиллинг, если вы занимаетесь веб-разработкой!Object.values()
является частью ES2017 , и вы получаете ошибку компиляции, потому что вам нужно настроить TS для использования библиотеки ES2017. Возможно, вы используете библиотеку ES6 или ES5 в текущей конфигурации TS.Решение: используйте
es2017
илиes2017.object
в вашем--lib
варианте компилятора .Например, используя
tsconfig.json
:Обратите внимание , что таргетинг ES2017 с машинописью никак не испускает polyfills в браузере для ES2017 (имея в виде выше решает вашу компиляции ошибки, но вы можете столкнуться во время выполнения ошибки , потому что браузер не реализует ES2017
Object.values
), это до вас , чтобы polyfill вашего проекта закодируйте себя, если хотите. А так какObject.values
еще не очень хорошо поддерживается всеми браузерами (на момент написания этой статьи) , вы определенно хотите polyfill:core-js
будет делать эту работу .источник
ES2017
на,es2017
но AFAIK это не обязательно, но я всегда хочу узнать, была ли причина для изменения?ES2017
,DOM
( в верхнем регистре) приведено вtsc --init
комментариях , как допустимые значения и корректно работает в компиляторе, но схема JSON перечисляет толькоes2017
,dom
варианты ( в нижнем регистре), так что JSON IDE / ЛИНТЕР флагES2017
,DOM
а недопустимые значения (даже если они действительны). Немного смущает.tsc --help
хотя отображает строчные буквыObject.values()
. Другими словами, вы можете обойти ошибку компиляции, но все равно столкнетесь с ошибками во время выполнения, если вы запускаете в браузере, который не имеетObject.values()
.Вы можете использовать это
Object.values
в TypeScript,(<any>Object).values(data)
если по какой-то причине вы не можете обновить ES7 в tsconfig.источник
if for some reason you can't update to ES7 in tsconfig
Вместо того
использование
В вашем примере:
Это скроет ошибку компилятора ts.
источник
lib
настройкой, чтобы отразить, как вы его используете, а не намеренно избегать компилятора.lib
настройка только для правильной проверки типов.Я увеличил цель,
tsconfig.json
чтобы включить эту функцию в TypeScriptисточник
Я только что решил эту проблему с Angular 6, используя CLI и рабочие пространства для создания библиотеки с использованием
ng g library foo
.В моем случае проблема была в
tsconfig.lib.json
папке библиотеки, которая не былаes2017
включена вlib
раздел.Любой, кто сталкивается с этой проблемой в Angular 6, просто должен убедиться, что вы обновляете
tsconfig.lib.json
как ваше приложение, так и ваше приложение.tsconfig.json
источник
Наличие моей
tslint
конфигурации правил здесь всегда заменяет строкуObject["values"](myObject)
наObject.values(myObject)
.Два варианта, если у вас есть такая же проблема:
(Object as any).values(myObject)
или
источник
Object["values"]
?Самый простой способ - привести к
Object
томуany
, вот так:И вуаля - без ошибок компиляции;)
источник
Еще проще использовать
_.values
из underscore.js https://underscorejs.org/#valuesисточник