Ответ 1
используя вместо этого Object.keys.
const data = {
a: "first",
b: "second",
};
const values = Object.keys(data).map(key => data[key]);
const commaJoinedValues = values.join(",");
console.log(commaJoinedValues);
Я пытаюсь сформировать разделенную запятыми строку из объекта,
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'
используя вместо этого Object.keys.
const data = {
a: "first",
b: "second",
};
const values = Object.keys(data).map(key => data[key]);
const commaJoinedValues = values.join(",");
console.log(commaJoinedValues);
Object.values()
является частью ES2017, и вы получаете ошибку компиляции, потому что вам нужно настроить TS для использования библиотеки ES2017. Возможно, вы используете библиотеку ES6 или ES5 в текущей конфигурации TS.
Решение: используйте es2017
или es2017.object
в параметре --lib
.
Например, используя tsconfig.json
:
"compilerOptions": {
"lib": ["es2017", "dom"]
}
Обратите внимание, что нацеливание на ES2017 с использованием TypeScript не генерирует полизаполнения в браузере для ES2017 (это означает, что приведенное выше исправляет ошибку компиляции, но вы все равно можете столкнуться с ошибкой времени выполнения, поскольку браузер не реализует ES2017 Object.values
), вы сами можете заполнить код своего проекта, если хотите. А поскольку Object.values
пока не очень хорошо поддерживается во всех браузерах (на момент написания этой статьи), вам определенно требуется полифилл: core-js
выполнит свою работу.
Вы можете использовать Object.values
в TypeScript, выполнив это (<any>Object).values(data)
если по какой-либо причине вы не можете обновить ES7 в tsconfig.
Вместо
Object.values(myObject);
использование
Object["values"](myObject);
В вашем примере:
const values = Object["values"](data).map(x => x.substr(0, x.length - 4));
Это скроет ошибку компилятора ts.
Я увеличил цель в моем tsconfig.json
чтобы включить эту функцию в TypeScript
{
"compilerOptions": {
"target": "es2017",
......
}
}
Я просто ударил эту точную проблему с помощью Angular 6, используя CLI и рабочие пространства, чтобы создать библиотеку, используя библиотеку ng g library foo
.
В моем случае проблема была в tsconfig.lib.json
в папке библиотеки, в которой не было es2017
включенного в раздел lib
.
Любой, кто наткнулся на эту проблему с помощью Angular 6, вам просто нужно убедиться, что вы обновили tsconfig.lib.json
а также свое приложение tsconfig.json
Наличие моей tslint
правил tslint
здесь всегда заменяет строку Object["values"](myObject)
на Object.values(myObject)
.
Два варианта, если у вас есть такая же проблема:
(Object as any).values(myObject)
или же
/*tslint:disable:no-string-literal*/
'Object["values"](myObject)'
Еще проще, используйте _.values
из underscore.js https://underscorejs.org/#values
Самый простой способ - передать Object
any
, например:
const data = {"Ticket-1.pdf":"8e6e8255-a6e9-4626-9606-4cd255055f71.pdf","Ticket-2.pdf":"106c3613-d976-4331-ab0c-d581576e7ca1.pdf"};
const obj = <any>Object;
const values = obj.values(data).map(x => x.substr(0, x.length - 4));
const commaJoinedValues = values.join(',');
console.log(commaJoinedValues);
И вуаля - никаких ошибок компиляции;)