类型: 错误 TS2693: “誓言”只是指一个类型,但是在这里被用作一个值

我试图使用我的 AWS Lambda 的类型脚本,我得到了以下错误,我曾经使用的承诺。

error TS2693: 'Promise' only refers to a type, but is being used as a value here.

我尝试在代码中使用以下变体

使用 Norman 构造函数

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

用的是“承诺”和“拒绝”

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

版本

下面是我的开发依赖项中的版本:

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

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"
]
}

我使用 grunt-ts 和下面的配置来运行 ts 任务。

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

我尝试了 我得到: [ ts ] & # 39; 瓶颈只是指一个类型,但是在这里被用作一个值中提到的解决方案,但没有运气。

160638 次浏览

我有同样的问题与 aws-sdk和我解决了它使用 "target": "es2015"。这是我的 tsconfig.json文件。

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

最后开始工作,没有任何错误。但多重变化。感谢 桑德罗 · 凯尔尖尖的工会的

  • 删除 dt ~ aws-lambda
  • 删除了 noEmit、声明等选项
  • 修改 Gruntfile 并删除 ignoreSettings

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"
}
},
...

如果您在项目中使用 绝对打字存储库,您可能会遇到 最近一期

你可能会使用的一个不错的解决方案(除了等待定义文件的更新版本或者重构你的 TS 代码)是为 core-js 类型指定一个显式的 version + build,而不是让 Visual Studio 选择最新的/最近的。我发现了一个似乎不受此问题影响的代码(至少在我的例子中) ,您可以使用它替换 包裹 Json 文件中的以下行:

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

下面这个:

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

这件事彻底解决了我的问题。但是,强烈建议在问题发布后尽快删除显式版本 + 构建引用。

关于这个问题的进一步信息,你也可以 阅读这篇博文,我写的主题。

我通过向 tsconfig.json 文件添加以下代码解决了这个问题。

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

通过更改编译器选项中的 目标解决。

{
"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
}
}

将下面一行添加到引发错误的文件中。这应该可以解决问题

declare var Promise: any;

这绝对不是最佳解决方案

我也遇到了同样的问题,这使我在第二轮中避免了这个问题:

在控制台中这样写:

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

在出现问题的文件中,复制粘贴以下内容:

import * as Promise from 'bluebird';

在打字机和 aws-sdk上也有同样的问题。解决的办法是将目标改为 es6

完整的 tsconfig.json文件:

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

今天遇到了同样的错误,并用以下方法解决了:

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

更新:

补充:

import {Promise} from 'es6-promise'

Core-js 对我来说不起作用,因为它引起了其他问题,但是,只要安装最新版本的 npm i @types/es6-promise --save-dev就可以解决这些问题。我遇到的问题源于编译一个使用 rxjs 的 sdk。以下是我得到的错误:

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

只需在 tsconfig.json 文件中将目标更改为“ ES2017”即可。

这是我的 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"
]
}

Npm i —— save-dev@types/es6-諾

在 up 命令之后,您最好检查 tsconfig.json,确保“ target”必须大于“ es6”。也许 TSC 还不支持 es5。

这里是我的提示。使用 vscode 1.21.1(在 MAC 上)进行测试

将下面的配置设置为 Tsconfig.json

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

进入 编译器选项

重新启动 IDE (此操作是必需的: D)

没有一个答案对我有用。这里有一个保证和合理的解决方案。把这个放在任何使用承诺的代码文件的顶部..。

declare const Promise: any;

我花了很多时间试图解决这个问题,但在这里或其他地方没有找到任何解决方案。

但后来才意识到,这不仅仅是解决问题。但是您还需要重新启动 VSCODE 才能使其生效。

在我在 typeScript3.0.1中添加以下 lib 数组之前,我也有同样的问题

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"]
}

我有这个错误,但是我使用这个命令解决了这个问题,我的 ts 文件名是 nose-fs. ts:

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

错误就消失了

好吧,这可能是反直觉的,但我解决了这个增加 esnext到我的 lib

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

编译器建议的 FIX 是

尝试将 lib编译器选项更改为 es2015或更高版本。

我也有同样的错误,我用这个配置修复了它:

文件: tsconfig.json

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

请注意,如果您使用文件名运行 tsc 命令,即:

tsc testfile.ts

然后忽略 tsconfig.json 编译器配置文件。 解决方案是单独运行 tsc 命令,在这种情况下,所有。将编译目录中的 ts 文件,除非您已经编辑 tsconfig.json 以包含一组文件。

参见“使用文件属性”..。 Https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

我用这些组合属性消除了 index.ts中的同样错误:

在 tsconfig.json 中:

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

在 package.json:

  "main": "index.ts",
"scripts": {
"start": "tsc -p tsconfig.json && node index.js"

这里有很多答案可以解决很多问题。然而,这个技巧已经在几个答案中提到了。单独回答 b/c,我想明确地说出来。

要修复这个问题,实际需要做的唯一更改是将“ target”更改为 > = “ es2015”。 然而,它没有说什么,如果它不会有一点该死的差异,直到你重新开始的想法: (

那么

  1. “编译器选项”: { 「目标」 : 「 es2015」
  2. 重启 IDE
  3. 呃。