typescript: error TS2693: 'Promise' refere-se apenas a um tipo, mas está sendo usado como um valor aqui


144

Estou tentando usar o Typecript para o meu AWS Lambda e estou recebendo os seguintes erros sempre que uso promessas.

erro TS2693: 'Promessa' refere-se apenas a um tipo, mas está sendo usado como um valor aqui.

Eu tentei usar as seguintes variações no código

Usando o construtor Promise

responsePromise = new Promise((resolve, reject) => {
                    return reject(new Error(`missing is needed data`))
                })

usando Promise.reject

responsePromise = Promise.reject(new Error(`Unsupported method "${request.httpMethod}"`));

Versões

A seguir estão as versões em minhas dependências de desenvolvimento:

"typescript": "^2.2.2"
"@types/aws-lambda": "0.0.9",
"@types/core-js": "^0.9.40",
"@types/node": "^7.0.12",

Conteúdo de tsconfig.json

{
    "compileOnSave": true,
    "compilerOptions": {
        "module": "commonjs",
        // "typeRoots" : ["./typings", "./node_modules/@types"],
        "target": "es5",
        // "types" : [ "core-js" ],
        "noImplicitAny": true,
        "strictNullChecks": true,
        "allowJs": true,
        "noEmit": true,
        "alwaysStrict": true,
        "preserveConstEnums": true,
        "sourceMap": true,
        "outDir": "dist",
        "moduleResolution": "Node",
        "declaration": true,
        "lib": [
            "es6"
        ]
    },
    "include": [
        "index.ts",
        "lib/**/*.ts"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]
}

Estou usando o grunt-ts com a seguinte configuração para executar a tarefa ts.

ts: {
            app: {
                tsconfig: {
                    tsconfig: "./tsconfig.json",
                    ignoreSettings: true
                }
            },
...

Eu tentei com a solução mencionada em Eu recebo: [ts] 'Promise' refere-se apenas a um tipo, mas está sendo usado como um valor aqui, mas sem sorte.


1
Nenhum valor de retorno é necessário para a função de retorno de chamada transmitida ao construtor Promise. Apenas se livre return.
Pointy

Você quer dizer assim? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})Eu tentei. Mas isso não ocorreu com o problema.
kalyanvgopal

Sim. O JavaScript não se importa se você devolve um valor ou não, mas não presta atenção a ele. TypeScript, no entanto, se importa.
Pointy 30/03

Entendi. Mas por que o tsc falha ao compilar qualquer tipo de Promose.resolve ou Promise.reject?
kalyanvgopal

Eu não sei. Como exatamente é responsePromisedeclarado?
Pointy 30/03

Respostas:


122

Eu tive o mesmo problema com o aws-sdke resolvi usando "target": "es2015". Este é o meu tsconfig.jsonarquivo.

{
    "compilerOptions": {
        "outDir": "./dist/",
        "sourceMap": false,
        "noImplicitAny": false,
        "module": "commonjs",
        "target": "es2015"
    },
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]
}

5
Obrigado Sandro. Tentei o mesmo, mas não ajudou no meu caso.
kalyanvgopal

Talvez @types/aws-lambdaestejam desatualizados. A Amazon envia tipos tipográficos com o SDK oficial . Não há necessidade de DefinitelyTyped.
Sandro Keil

Isso resolveu o erro exato definido na pergunta para mim e eu estava apenas importando o rxjs, sem usar o Promis. Muito obrigado!
muzurB

3
Esta é provavelmente a melhor resposta para aqueles que estavam alvejando o es5. Mudar de es5 para es2015 também corrigiu isso para mim também. Esteja avisado, no entanto, você provavelmente ainda verá o erro até desligar e reiniciar o seu IDE / editor. Alguma coisa no TSC (ou no modo de exibição) fazia parecer que isso não estava sendo corrigido quando realmente era, mas exigia o reinício do vscode.

7
update / adendum: se você ainda deseja direcionar o es5 (para um melhor suporte ao navegador e é importante) que ainda funcione, desde que você o forneça nas opções do compilador: "lib": ["es2015", "dom", " ScriptHost "], O truque para mim foi perceber que eu tinha que reiniciar o editor VSCode, antes que ele começasse a funcionar depois de fazer essa alteração.

83

Encontre o mesmo erro hoje e resolva-o com:

npm i --save-dev  @types/es6-promise

Atualizar:

adicionar:

import {Promise} from 'es6-promise'

3
+ E reiniciar Código VS ajuda também, após a instalação dos tipos
Legends

4
Errata: Funciona usando esta linha import {Promise} from 'es6-promise';
Loic Coenen

onde adicionar "importar {Promessa} de 'es6-promessa'"?
bArraxas

Eu usei essa solução no passado, mas não está funcionando para mim no momento. import { Promise } from '../node_modules/es6-promise/es6-promise';, no entanto, parece estar funcionando bem. Por que o TS não conseguiu encontrar as tipagens instaladas?
snarf 01/12/19

35

Resolvi isso adicionando o código abaixo ao arquivo tsconfig.json.

"lib": [
    "ES5",
    "ES2015",
    "DOM",
    "ScriptHost"]

3
isso funcionou para mim, mas observe que a matriz "lib" precisa estar dentro do objeto "compilerOptions" no arquivo tsconfig.json.
BillyRayCyrus

5
Usando o TypeScript 2.4.1, tive que alterar todos os caracteres na matriz de strings para serem minúsculos. Então funcionou. Muito Obrigado.
JDTLH9

18

Resolvido alterando o destino em compilerOptions.

{
"compilerOptions": {
    "module": "es2015",
    "target": "es2015",
    "lib": [
        "es2016",
        "dom"
    ],
    "moduleResolution": "node",
    "noImplicitAny": false,
    "sourceMap": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "outDir": "./public/js/app"
},
"exclude": [
    "node_modules",
    "public/js",
    "assets/app/polyfills.ts"
],
"angularCompilerOptions": {
    "skipMetadataEmit": true
}
}

11

Aqui está a minha dica. Testado com vscode 1.21.1 (no MAC)

Coloque abaixo da configuração em tsconfig.json

"lib": [
"es2016",
"dom"
]

em compilerOptions

Reinicie o IDE (esta ação é necessária: D)


3
Isso está listado em várias respostas aqui e é importante, com certeza: "Reinicie o IDE (esta ação é necessária)"
atconway

7

Eu tive esse erro, mas o resolvi usando este comando, meu nome de arquivo ts é promises-fs.ts:

tsc promises-fs.ts --target es6 && node promises-fs.js

e o erro se foi


5

Adicione abaixo da linha ao arquivo em que o erro está sendo gerado. Isso deve corrigir o problema

declare var Promise: any;

PS: Esta definitivamente não é a solução ideal


18
Isso é apenas remover a verificação de tipo de 'Promessa', em vez de corrigi-la para que o TypeScript encontre o tipo correto.
edibleEnergy

1
Esta solução alternativa não funciona com o Internet Explorer 11, por exemplo. Lancei um erro 'indefinido' ao tentar usar o Promise. De qualquer forma, com o Chrome, a solução alternativa faz seu trabalho.
Calin Vlasin

1
isso é uma saída covarde. Por que usar o TSse você estiver fazendo algo assim? Quero dizer, qual é o sentido então ?!
Hafiz Temuri

1
Concordo que isso não é o ideal, mas é injusto dizer que esta declaração significa que não faz sentido usar o TS. Soltar a verificação de tipo em um tipo não torna o restante inútil. E para mim, essa foi a única solução que funcionou.
Thorkil Værge

Pode ser um truque sujo, mas é a única coisa que funcionou para mim depois que tentei todas as outras soluções nesta página. Pelo menos eu tenho meu código compilado e funcionando. Eu cavo hacks sujos que funcionam.
Jeremy Thille 29/01

4

Finalmente, o tsc começou a trabalhar sem erros. Mas várias mudanças. Graças a Sandro Keil , Pointy e unional

  • Removido dt ~ aws-lambda
  • Opções removidas como noEmit, declaração
  • Arquivo Grunt modificado e ignoreSettings removidos

tsconfig.json

{
    "compileOnSave": true,
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": false,
        "strictNullChecks": true,
        "alwaysStrict": true,
        "preserveConstEnums": true,
        "sourceMap": false,
        "moduleResolution": "Node",
        "lib": [
            "dom",
            "es2015",
            "es5",
            "es6"
        ]
    },
    "include": [
        "*",
        "src/**/*"
    ],
    "exclude": [
        "./node_modules"
    ]
}

Gruntfile.js

ts: {
            app: {
                tsconfig: {
                    tsconfig: "./tsconfig.json"
                }
            },
...

4

Tinha o mesmo problema com o texto datilografado e o aws-sdk. A solução era mudar o alvo para es6.

Meu tsconfig.jsonarquivo completo :

{
        compilerOptions: {
                outDir: ./dist/,
                sourceMap: true,
                noImplicitAny: true,
                module: commonjs,
                target: es6,
                jsx: react,
                allowJs: true
        },
        include: [
                ./src/**/*
    ]
}

3
Sim, a segmentação do es6 deve corrigi-lo, mas você tem menos compatibilidade com o navegador. A maioria dos aplicativos são ainda hoje alvo ES5, porque muitos navegadores ainda não estão em ES6 ainda (a partir de 2017)

@ user2080225, embora isso seja verdade, ela não torna minha resposta menos correta, pois a pergunta original não dizia nada sobre a compatibilidade do navegador. Portanto, essa solução ainda pode ajudar outras pessoas como ela me ajudou.
Fanus du Toit 09/04

3

Eu tive o mesmo problema até adicionar a seguinte matriz lib no typeScript 3.0.1

tsconfig.json

{
  "compilerOptions": {
    "outDir": "lib",
    "module": "commonjs",
    "allowJs": false,
    "declaration": true,
    "target": "es5",
    "lib": ["dom", "es2015", "es5", "es6"],
    "rootDir": "src"
  },
  "include": ["./**/*"],
  "exclude": ["node_modules", "**/*.spec.ts"]
}

2

Bem, isso pode ser contra-intuitivo, mas resolvi isso adicionando esnextao meu lib.

{
  "compilerOptions": {
    "lib": [
        "esnext"
    ],
    "target": "es5",
  }
}

O FIX, conforme sugerido pelo compilador, é

Tente alterar a libopção do compilador para es2015 ou posterior.


1

Core-js não funcionou para mim, pois causou outros problemas, no entanto, basta instalar a versão mais recente e npm i @types/es6-promise --save-devse livrar dos problemas. Os problemas para mim surgiram da compilação de um sdk que estava usando o rxjs. Aqui está o erro que eu estava recebendo:

`node_modules/rxjs/Observable.d.ts(59,60): error TS2693: Promise only refers to a type, but is being used as a value here.`

1

Se você estiver usando o repositório DefinitelyTyped em seu projeto, poderá estar enfrentando esse problema recente .

Uma solução decente que você pode usar (além de aguardar uma compilação atualizada do arquivo de definições ou refatorar o código TS) é especificar uma versão explícita + compilação para as tipificações core-js em vez de permitir que o Visual Studio escolha a mais recente / mais recente . Eu encontrei um que parece não ser afetado por esse problema (pelo menos no meu caso), você pode usá-lo substituindo a seguinte linha do arquivo package.jso n:

  "scripts": {
    "postinstall": "typings install dt~core-js --global"
  }

Com o seguinte:

  "scripts": {
    "postinstall": "typings install dt~core-js@0.9.7+20161130133742 --global"
  }

Isso corrigiu meu problema definitivamente. No entanto, é altamente recomendável remover a versão explícita + a referência de compilação assim que o problema for lançado.

Para mais informações sobre esse problema, você também pode ler esta postagem de blog que escrevi sobre o assunto.


0

Eu tive o mesmo problema e isso me salvou do problema em segundo:

escreva no console isso:

npm i --save bluebird
npm i --save-dev @types/bluebird @types/core-js@0.9.36

no arquivo em que o problema está copiado, cole este:

import * as Promise from 'bluebird';

0

Apenas mude o destino para "ES2017" no arquivo tsconfig.json.

este é o meu arquivo tsconfig.json

{
"compilerOptions": {
/* Basic Options */
    "target": "ES2017",   /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
    "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
    "declaration": true,  /* Generates corresponding '.d.ts' file. */
    "sourceMap": true,    /* Generates corresponding '.map' file. */
    "outDir": "./dist",   /* Redirect output structure to the directory. */
    "strict": true        /* Enable all strict type-checking options. */
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "node_modules"
  ]
}

0

npm i --save-dev @ types / es6-promessa

Após o comando up, é melhor verificar o tsconfig.json para garantir que o "target" seja maior que o "es6". talvez o tsc não suporte es5 ainda.


0

Nenhuma das respostas votadas aqui funciona para mim. Aqui está uma solução garantida e razoável. Coloque isso próximo ao topo de qualquer arquivo de código que use o Promise ...

declare const Promise: any;

2
Não, não faça isso ... ou simplesmente não usar o texto datilografado, se você estiver indo para fazer algo assim
Hafiz Temuri

0

Tendo passado muito tempo tentando consertar isso. Não tive sorte com nenhuma solução fornecida aqui ou em outro lugar.

Mas depois percebi que não era apenas resolver o problema. Mas você também precisa reiniciar o VSCODE para que ele tenha efeito.


0

Eu tive o mesmo erro e o corrigi com esta configuração:

Arquivo: tsconfig.json

{
  "compilerOptions": {
    "target": "es2015",                      
    "module": "commonjs",                    
    "strict": true,                          
    "esModuleInterop": true                  
  }
}

0

Esteja ciente de que se você estiver executando o comando tsc com um nome de arquivo, por exemplo:

tsc testfile.ts

o arquivo de configuração do compilador tsconfig.json é ignorado. A solução é executar o comando tsc por conta própria; nesse caso, todos os arquivos .ts no diretório serão compilados, a menos que você tenha editado o tsconfig.json para incluir um conjunto de arquivos.

consulte 'usando a propriedade de arquivos' ... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html


0

O mesmo erro aqui. Corrigi isso usando "module": "ES6" no tsconfig.


0

Eu me livrei desse mesmo erro em index.ts com essas propriedades combinadas:

No tsconfig.json:

  "compilerOptions": {
    "target": "ES6"

E no package.json:

  "main": "index.ts",
  "scripts": {
    "start": "tsc -p tsconfig.json && node index.js"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.