Как использовать Object.values с машинописным текстом?

Я пытаюсь сформировать разделенную запятыми строку из объекта,

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'

Ответ 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);

Ответ 2

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 выполнит свою работу.

Ответ 3

Вы можете использовать Object.values в TypeScript, выполнив это (<any>Object).values(data) если по какой-либо причине вы не можете обновить ES7 в tsconfig.

Ответ 4

Вместо

Object.values(myObject);

использование

Object["values"](myObject);

В вашем примере:

const values = Object["values"](data).map(x => x.substr(0, x.length - 4));

Это скроет ошибку компилятора ts.

Ответ 5

Я увеличил цель в моем tsconfig.json чтобы включить эту функцию в TypeScript

{
    "compilerOptions": {
        "target": "es2017",
        ......
    }
}

Ответ 6

Я просто ударил эту точную проблему с помощью Angular 6, используя CLI и рабочие пространства, чтобы создать библиотеку, используя библиотеку ng g library foo.

В моем случае проблема была в tsconfig.lib.json в папке библиотеки, в которой не было es2017 включенного в раздел lib.

Любой, кто наткнулся на эту проблему с помощью Angular 6, вам просто нужно убедиться, что вы обновили tsconfig.lib.json а также свое приложение tsconfig.json

Ответ 7

Наличие моей tslint правил tslint здесь всегда заменяет строку Object["values"](myObject) на Object.values(myObject).

Два варианта, если у вас есть такая же проблема:

(Object as any).values(myObject)

или же

/*tslint:disable:no-string-literal*/
'Object["values"](myObject)'

Ответ 9

Самый простой способ - передать 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);

И вуаля - никаких ошибок компиляции;)