Estou tentando formar uma string separada por vírgula de um objeto,
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);
Como fazer isso com o TypeScript?
obtendo um arquivo de erro:
severity: 'Error'
message: 'Property 'values' does not exist on type 'ObjectConstructor'.'
at: '216,27'
source: 'ts'
typescript
object
user2280016
fonte
fonte
Object.values
no TS para resolver o erro de compilação do OP. Para fazer isso, você simplesmente precisaES2017
em sua--lib
configuração.ES2017
lib e incluir a biblioteca polyfills onde usá-la. Dê uma resposta diferente a pessoas diferentes.ES7/Object.values()
. Talvez você pense que é complexo (não discordo), mas essa é apenas a natureza de tentar usar recursos futuros comoObject.values()
hoje. Sempre foi assim. AindaObject.keys()
deve ser preenchido com polifilme se você estava direcionado para o ES3 ou deseja oferecer suporte ao IE8 (espero que não exista mais!) Em geral, é uma boa idéia entender os recursos de ES, o suporte ao navegador e o preenchimento com polifilling se você estiver em desenvolvimento na Web!Object.values()
faz parte do ES2017 , e o erro de compilação que você está recebendo é porque você precisa configurar o TS para usar a biblioteca ES2017. Você provavelmente está usando a biblioteca ES6 ou ES5 na sua configuração atual do TS.Solução: use
es2017
oues2017.object
na sua--lib
opção de compilador .Por exemplo, usando
tsconfig.json
:Nota que a segmentação ES2017 com texto datilografado que não emitem polyfills no navegador para ES2017 (ou seja, os resolve acima de sua compilação de erro, mas você ainda pode encontrar um tempo de execução de erro porque o navegador não implementa ES2017
Object.values
), é até você para polyfill seu projeto codifique-se, se quiser. E comoObject.values
ainda não é bem suportado por todos os navegadores (no momento da redação deste documento), você definitivamente deseja um polyfill:core-js
fará o trabalho .fonte
ES2017
daes2017
mas AFAIK isso não é necassary, mas eu sempre quero aprender, havia uma razão para a mudança?ES2017
,DOM
(maiúsculas) está listado notsc --init
comentário como os valores válidos e ele funciona corretamente no compilador, mas o esquema JSON enumera apenas ases2017
,dom
opções (minúsculas), de modo JSON IDE / bandeira vontade linterES2017
,DOM
como valores inválidos (mesmo que válidos). Um pouco confuso.tsc --help
exibe letras minúsculasObject.values()
. Em outras palavras, você pode contornar o erro de compilação, mas ainda assim ocorrer erros de tempo de execução se você executar em um navegador que não possuiObject.values()
.Você pode usar o
Object.values
TypeScript fazendo isso(<any>Object).values(data)
se, por algum motivo, não puder atualizar para o ES7 no tsconfig.fonte
if for some reason you can't update to ES7 in tsconfig
Ao invés de
usar
No seu caso de exemplo:
Isso ocultará o erro do compilador ts.
fonte
lib
configuração para refletir como o está usando, e não escapar intencionalmente do compilador.lib
configuração é apenas para obter a verificação de tipo correta.tsconfig.json
Aumentei o alvo no meu para ativar esse recurso no TypeScriptfonte
Acabei de acertar esse problema exato com o Angular 6 usando a CLI e os espaços de trabalho para criar uma biblioteca usando
ng g library foo
.No meu caso, o problema estava na
tsconfig.lib.json
pasta da biblioteca que não haviaes2017
incluído no arquivolib
seção.Se você se deparar com esse problema com o Angular 6, basta garantir que você atualize você
tsconfig.lib.json
e seu aplicativotsconfig.json
fonte
Ter minhas
tslint
regras de configuração aqui sempre substituindo a linhaObject["values"](myObject)
porObject.values(myObject)
.Duas opções se você tiver o mesmo problema:
(Object as any).values(myObject)
ou
fonte
Object["values"]
?A maneira mais simples é converter o
Object
paraany
, assim:E voila - sem erros de compilação;)
fonte
Ainda mais simples, use a
_.values
partir de underscore.js https://underscorejs.org/#valuesfonte