Typescript와 함께 Object.values를 사용하는 방법은 무엇입니까?


135

쉼표로 구분 된 문자열을 객체에서 형성하려고합니다.

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'

답변:


106

대신 Object.keys를 사용하십시오.

const data = {
  a: "first",
  b: "second",
};

const values = Object.keys(data).map(key => data[key]);

const commaJoinedValues = values.join(",");
console.log(commaJoinedValues);

90
이것은 Object.valuesOP의 컴파일 오류를 해결하기 위해 TS에서 ES7을 사용하는 방법에 대한 실제 답변이 아닌 대안 (좋은 것입니다!)에 유의하십시오 . 당신은 단순히 필요한 것을해야 할 ES2017당신에 --lib설정.
Aaron Beall

4
@Aaron 솔루션은 너무 복잡하여 타이프 스크립트를 처음 접하는 사람은 받아 들일 수 없으며 컴파일하려면 ES2017lib 를 추가 해야하며 사용하는 곳에 polyfills 라이브러리를 포함해야합니다. 다른 사람들과 다른 답변을 얻을 수 있습니다.
holi-java

9
@ holi-jave OP가 시도한 것처럼 TS 및 아직 비표준 JS 기능이 작동하는 방식은 "나의 솔루션"이 아니다 ES7/Object.values(). 어쩌면 당신은 그 복잡한 것을 생각하지만 (나는 동의하지 않습니다), 그것은 Object.values()오늘날 과 같은 미래의 기능을 사용하려고하는 본질입니다 . 항상 이런 식이었습니다. Object.keys()ES3를 대상으로하거나 IE8을 지원하려는 경우 에도 여전히 채워져 있어야합니다 (더 이상은 그렇지 않습니다!). 웹 개발중인 경우 일반적으로 ES 기능, 브라우저 지원 및 폴리 필을 이해하는 것이 좋습니다.
Aaron Beall

@Aaron 나는 그것이 복잡하다고 말하지는 않지만 typescript / javascript를 처음 접하는 사람은 더 복잡하고 받아들이지 않습니다.
holi-java


224

Object.values() 이다 ES2017의 일부 ES2017 라이브러리를 사용하도록 TS를 구성해야하기 때문에 컴파일 오류가 발생합니다. 현재 TS 구성에서 ES6 또는 ES5 라이브러리를 사용 중일 수 있습니다.

해결책 : 사용 es2017또는es2017.object 당신의 --lib컴파일러 옵션 .

예를 들어 tsconfig.json :

"compilerOptions": {
    "lib": ["es2017", "dom"]
}

TypeScript로 ES2017을 타겟팅하면 ES2017 의 브라우저에서 폴리 필이 생성 되지 않습니다 (위의 방법으로 컴파일 오류가 해결 되지만 브라우저가 ES2017을 구현하지 않기 때문에 여전히 런타임 오류 가 발생할 수 있음 Object.values), 프로젝트를 폴리 필해야합니다 원하는 경우 직접 코드를 작성하십시오. 그리고이 글을 쓰는 시점에서 Object.values모든 브라우저가 아직 잘 지원하지 않기 때문에 polyfill을 원합니다 : core-jswill do the job .


1
@ErikvanVelzen 당신의 경우 변경할 수있는 답변을 편집 ES2017하는 방법에 대해 es2017변경에 대한 이유가 있지만, AFAIK이가 necassary 아니지만, 나는 항상 배우고 싶은 있었다?
Aaron Beall

2
^ 내 자신의 질문에 대답하려면 : ES2017, DOM(대문자)가 tsc --init주석에 유효한 값으로 나열되고 컴파일러에서 올바르게 작동하지만 JSON 스키마es2017, dom(소문자) 옵션 만 열거 하므로 JSON IDE / linter는 다음 ES2017DOM같이 플래그 를 지정합니다. 유효하지 않은 값은 유효하지 않습니다. 약간 혼란 스럽다.
Aaron Beall

실제로 그 이유입니다. 참고로 대문자로 작동합니다. tsc --help그래도 소문자 표시
Erik van Velzen

이 pollyfill을 추가하는 방법이 아니라면 core-js가 각도에 포함되어 있지 않습니까?
Samiullah Khan

1
@ Totty.js TS에 포함 된 라이브러리 파일은 형식 검사만을 위한 것 Object.values()입니다. 즉, 실제로는 JS 라이브러리 폴리 필을 생성하지 않습니다 . 즉, 컴파일 오류를 해결할 수 있지만가없는 브라우저에서 실행하면 여전히 런타임 오류가 발생할 수 있습니다 Object.values().
Aaron Beall

18

어떤 이유로 tsconfig에서 ES7로 업데이트 할 수없는 경우 Object.valuesTypeScript에서이를 수행 하여 사용할 수 있습니다 (<any>Object).values(data).


4
게시 당시 @Aaron은 특정 버전의 Angular를 사용하는 사람들이 작동하지 않는 lib를 업데이트하는 데 문제가 있음을 나타내는 의견이있었습니다. 내가 넣어 이유입니다if for some reason you can't update to ES7 in tsconfig
mtpultz

11

대신에

Object.values(myObject);

사용하다

Object["values"](myObject);

귀하의 예의 경우 :

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

이것은 ts 컴파일러 오류를 숨길 것입니다.


1
당신은 천재입니다 (^- ') b
harufumi.abe

'ObjectConstructor'유형에는 색인 서명이 없으므로 요소는 암시 적으로 'any'유형을
갖습니다 .ts

6
이것은 TS의 오용입니다. lib의도적으로 컴파일러를 이스케이프하지 않고 사용 방법을 반영 하도록 설정으로 컴파일러를 구성해야합니다 .
Aaron Beall

1
@AaronBeall 어떤 이유로 든 es2017로 업그레이드 할 수없는 경우 유용합니다
Dino

@Dino es2017로 업그레이드 할 필요가 없으며 core-js 를 사용 하여 ES5까지 완전히 채울 수 있습니다 . TypeScript에는 런타임이 없으며 lib설정은 올바른 유형 확인을 얻는 것입니다.
Aaron Beall

11

tsconfig.jsonTypeScript에서이 기능을 사용하도록 대상을 증가 시켰습니다.

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

이전 브라우저와의 호환성을 유지하려는 경우 대상을 변경하는 것은 해결책이 아닙니다. Typescript는 ES2017 구문을 ES2015로 변환 할 수 있어야합니다.
무작위

4

CLI와 작업 공간을 사용하여 Angular 6 에서이 정확한 문제에 부딪 쳤습니다 ng g library foo.

필자의 경우 문제는 섹션에 포함 tsconfig.lib.json되지 않은 라이브러리 폴더 es2017lib있습니다.

Angular 6 에서이 문제를 겪고있는 사람 tsconfig.lib.json은 응용 프로그램뿐만 아니라 사용자를 업데이트 해야합니다.tsconfig.json


es2017을 tsconfig.lib와 tsconfig.json에 모두 넣었지만 항목을 사용하려고 할 때 여전히 '항목이 객체에 존재하지 않습니다'라는 오류가 발생합니다. 변경 / 업데이트해야 할 다른 것이 있습니까?
Maurice

나는 지금 tsconfig.lib의 대상을 es2017로 변경했지만 여전히 동일한 오류입니다.
Maurice

2

나의 갖는 tslint항상 라인을 대체 여기 규칙 구성을 Object["values"](myObject)함께 Object.values(myObject).

동일한 문제가있는 경우 두 가지 옵션 :

(Object as any).values(myObject)

또는

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

1
왜 사용하고 싶 Object["values"]습니까?
Aaron Beall

-4

가장 간단한 방법은 다음과 같이 Objectto 를 캐스팅하는 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);

그리고 voila – 컴파일 오류가 없습니다.)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.