打字稿:错误TS2693:“承诺”仅引用一种类型,但在此处用作值


144

我正在尝试将Typescript用于我的AWS Lambda,并且在我使用promise的地方都遇到以下错误。

错误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 = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})我尝试过这个。但这并没有解决问题。
kalyanvgopal

是。JavaScript不在乎是否返回值,但它不会关注它。但是,TypeScript确实在乎。
Pointy

得到它了。但是,为什么tsc无法编译Promose.resolve或Promise.reject的任何样式?
kalyanvgopal

那我不知道 确切地responsePromise声明了什么?
Pointy

Answers:


122

我与存在相同的问题,aws-sdk并通过使用解决了此问题"target": "es2015"。这是我的tsconfig.json档案。

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

5
谢谢桑德罗。尝试相同,但对我的情况没有帮助。
kalyanvgopal

也许@types/aws-lambda已经过时了。Amazon随官方SDK提供 Typescript类型。不需要DefinitelyTyped。
桑德罗·基尔

那为我解决了问题中定义的确切错误,我只是导入rxjs,甚至没有使用Promis。非常感谢!
muzurB

3
对于那些最初将es5作为目标的人来说,这可能是最好的答案。从es5切换到es2015也为我修复了此问题。但是请注意,在关闭并重新启动IDE /编辑器之前,您可能仍然会看到错误。关于TSC(或它的监视模式)的某些事情似乎使它似乎并没有解决,而实际上需要重新启动vscode。

7
更新/附录:如果您仍要针对es5(为了获得更好的浏览器支持,并且很重要),只要您在编译器选项中提供此功能,它仍然可以正常工作:“ lib”:[“ es2015”,“ dom”,“ ScriptHost“],对我来说,诀窍在于,我必须重新启动VSCode编辑器,然后才能进行更改。

83

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

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

更新:

加:

import {Promise} from 'es6-promise'

3
+和重新启动VS代码也有帮助,安装类型后
传奇

4
勘误表:它在此行中有效 import {Promise} from 'es6-promise'
Loic Coenen '18

在何处添加“从'es6-promise'导入{Promise}”?
bArraxas

我过去曾使用过此解决方案,但目前不适用于我。import { Promise } from '../node_modules/es6-promise/es6-promise';但是,似乎工作正常。为什么TS无法找到已安装的类型?
snarf

35

我通过将以下代码添加到tsconfig.json文件来解决此问题。

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

3
这对我有用,但是请注意,“ lib”数组必须位于tsconfig.json文件中的“ compilerOptions”对象内。
BillyRayCyrus

5
使用TypeScript 2.4.1,我必须将字符串数组中的所有字符更改为小写。然后它起作用了。非常感谢。
JDTLH9

18

通过在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

这是我的提示。已通过vscode 1.21.1测试(在MAC上)

将下面的配置放入tsconfig.json

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

进入 compileOptions

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


3
这在此处的多个答案中列出,并且务必确保重要:“重新启动IDE(需要执行此操作)”
atconway,

7

我遇到了这个错误,但是我通过使用以下命令解决了这个问题,我的ts文件名是promises-fs.ts:

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

错误消失了


5

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

declare var Promise: any;

PS:这绝对不是最佳解决方案


18
这只是删除“ Promise”的类型检查,而不是修复它,以便Typescript找到正确的类型。
可食用能源'17

1
例如,此解决方法不适用于Internet Explorer 11。我在尝试使用Promise时抛出“未定义”错误。无论如何,Chrome都能解决此问题。
卡林·弗拉辛

1
那是胆怯的出路。TS如果要执行这样的操作,为什么要使用。我的意思是什么?!
哈菲兹·特姆里

1
我同意这不是最佳选择,但是不公平地说该声明意味着使用TS没有意义。在一种类型上丢弃typecheck 不会使其余的typecheck失效。对我来说,这是唯一有效的解决方案。
ThorkilVærge19年

可能是肮脏的骇客,但在我尝试了此页上的所有其他解决方案之后,这对我唯一有用。至少我的代码已经编译并可以正常工作。我挖了一些有用的脏东西。
Jeremy Thille

4

最终,tsc开始工作,没有任何错误。但是有很多变化。由于桑德罗的Keilunional

  • 删除dt〜aws-lambda
  • 删除了诸如noEmit,declaration之类的选项
  • 修改了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"
                }
            },
...

4

打字稿和aws-sdk。解决的办法是将目标更改为es6

我的完整tsconfig.json档案:

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

3
是的tartgeting es6应该可以解决此问题,但是浏览器兼容性较差。如今,大多数应用仍以es5为目标,因为许多浏览器仍未使用es6(截至2017年)

@ user2080225虽然是正确的,但它不会使我的答案不太正确,因为原始问题并未说明有关浏览器兼容性的任何内容。因此,此解决方案仍然可以像帮助我一样帮助其他人。
Fanus du Toit

3

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

2

嗯,这可能是反直觉的,但我解决了这个添加esnext到我的lib

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

FIX,如编译器建议的那样

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


1

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.`

1

如果您在项目中使用DefinitelyTyped存储库,则可能会遇到此最新问题

您可能要使用的一种不错的解决方法(除了等待定义文件的更新版本或重构您的TS代码之外)是为core-js类型指定显式版本+构建,而不是让Visual Studio选择最新/最新版本。 。我发现一个似乎不受此问题影响的文件(至少就我而言),您可以使用它替换package.jso n文件中的以下行:

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

与以下之一:

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

这永远解决了我的问题。但是,强烈建议在问题发布后立即删除显式的版本+构建参考。

有关此问题的更多信息,您还可以阅读我撰写的有关此主题的博客文章


0

我遇到了同样的问题,这使我免除了第二个问题:

在控制台中这样写:

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

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

import * as Promise from 'bluebird';

0

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

0

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

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


0

这里没有任何投票赞成的答案对我有用。这是一个有保证且合理的解决方案。将此放在使用Promise的任何代码文件的顶部附近。

declare const Promise: any;

2
不,不要这样做...或者如果您要做这样的事情就不要使用打字稿
Hafiz Temuri 19-4-14

0

花了很多时间试图解决这个问题。我在这里或其他地方提供的任何解决方案都没有运气。

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


0

我遇到了相同的错误,并使用以下配置对其进行了修复:

档案:tsconfig.json

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



0

index.ts使用这些组合属性,我摆脱了同样的错误:

在tsconfig.json中:

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

在package.json中:

  "main": "index.ts",
  "scripts": {
    "start": "tsc -p tsconfig.json && node index.js"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.