TypeScript: 错误 TS2693:'Promise' 只能作为类型引用,但在此处被用作值。

177

我想在我的AWS Lambda中使用Typescript,但是每当我使用promises时,我会得到以下错误:

error TS2693: 'Promise'仅引用了一种类型,但在此处被用作值。

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

使用Promise构造函数

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

使用 Promise.reject

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] 'Promise'只是引用一个类型,但在这里被用作值中提到的解决方法,但没有成功。


1
传递给 Promise 构造函数的回调函数不需要返回值,只需删除 return 即可。 - Pointy
那个,我不知道。responsePromise 到底是如何声明的? - Pointy
noEmit是什么?http://www.typescriptlang.org/docs/handbook/compiler-options.html - unional
如果函数需要返回一个值,那么一定需要使用'return'关键字。我也遇到了这个问题,这显然与TypeScript无法正确处理Promise对象有关,而与kalyanvgopal的代码没有任何关系,因为他的代码是正确的。 - user2080225
对于那些尝试以下任何答案却没有成功的人,请确保你的 tsconfig.json 文件在正确的目录下!我的文件在一个比引发 ts2693 错误的文件更低的目录中。 - johnsimer
显示剩余4条评论
23个回答

135

我遇到了与aws-sdk相同的问题,我通过使用"target": "es2015"解决了这个问题。 这是我的tsconfig.json文件。

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

也许 @types/aws-lambda 已经过时了。亚马逊使用 官方 SDK 提供 Typescript 类型。因此,不需要使用 DefinitelyTyped。 - Sandro Keil
这对我来说解决了问题中定义的确切错误,而我只是导入rxjs,甚至没有使用Promis。非常感谢! - muzurB
3
对于那些一开始就以es5为目标的人来说,这可能是最好的答案。对我来说,从es5转换到es2015也解决了这个问题。但请注意,你可能仍然会看到错误提示,直到你关闭并重新启动你的IDE或编辑器。某些关于TSC(或其监视模式)的东西会让你觉得这并没有修复,当实际上已经修复,但需要重启vscode。 - user2080225
8
更新/补充:如果你仍然想以 ES5 为目标(以获得更好的浏览器支持,这很重要),只要在编译选项中提供以下内容即可:"lib": ["es2015", "dom", "ScriptHost"]对我来说,诀窍在于意识到在做出更改后,我必须重新启动 VSCode 编辑器才能使其开始工作。 - user2080225

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

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

更新:

添加:

import {Promise} from 'es6-promise'

4
重新启动VS Code也有帮助,特别是在安装类型之后。 - Legends
5
勘误:使用以下代码即可运行`import {Promise} from 'es6-promise'`; - Loic Coenen
在哪里添加 "import {Promise} from 'es6-promise'"? - bArraxas
我以前用过这个解决方案,但目前它对我不起作用。然而,import { Promise } from '../node_modules/es6-promise/es6-promise';似乎工作正常。为什么TS无法找到已安装的类型定义文件呢? - snarf

40

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

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

3
这对我有用,但请注意,“lib”数组需要位于tsconfig.json文件中的“compilerOptions”对象内。 - Andrew Aarestad
5
使用 TypeScript 2.4.1,我必须将字符串数组中的所有字符都改为小写。然后它就工作了。非常感谢。 - JDTLH9

18

通过更改compilerOptions中的目标(target)来解决问题。

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

12

这是我的建议。在MAC上使用vscode 1.21.1测试过。

将以下配置添加到tsconfig.json文件中:

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

进入compilerOptions

重新启动IDE(这是必须的:D)


3
这个问题的多个答案中都提到了这一点,并且它非常重要:"重新启动IDE(必须执行此操作)"。 - atconway

11
我用以下组合属性在index.ts中解决了同样的错误:
在tsconfig.json中:
  "compilerOptions": {
    "target": "ES6"

在package.json中:

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

9

我曾遇到这个错误,但我使用了以下命令解决了它。我的ts文件名为promises-fs.ts:

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

现在错误已经消失了。


6
将以下代码添加到出现错误的文件中。这样应该可以解决问题。
declare var Promise: any;

顺便说一句:这绝对不是最优解决方案。


22
这只是取消对“Promise”类型的检查,而不是修复Typescript找到正确类型的问题。 - edibleEnergy
1
例如,这个解决方法在Internet Explorer 11上不起作用。当尝试使用Promise时,它会抛出“undefined”错误。但是在Chrome中,该解决方法能够正常工作。 - Calin Vlasin
1
这是一种懦夫的做法。如果你要这样做,为什么还要使用 TS 呢?我的意思是,那还有什么意义呢?! - Hafiz Temuri
1
我同意这不是最优解,但说这个声明意味着使用TS没有意义是不公平的。在一个类型上取消类型检查并不意味着其他类型检查都无用。而对我来说,这是唯一可行的解决方案。 - Thorkil Værge
可能是一个不太正规的方法,但在我尝试了这页上所有其它的解决方案之后,这是唯一能让我的代码编译并工作的方法。至少现在我的代码可以运行了,我喜欢那些虽然不够正规但却管用的方法。 - Jeremy Thille

5

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

4

我曾遇到typescript和aws-sdk的相同问题。解决方法是将目标改为es6

我的完整 tsconfig.json 文件:

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

3
针对 es6 进行开发应该可以解决这个问题,但是这样会导致应用程序的兼容性降低。因为截至 2017 年许多浏览器仍然未支持 es6,所以现在大部分应用程序仍然以 es5 为目标。 - user2080225
@user2080225 虽然那是正确的,但由于原始问题没有说明浏览器兼容性,这并不会使我的答案不正确。因此,这个解决方案仍然可以像它帮助了我一样帮助其他人。 - FanManPro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接