打字稿:错误 TS2693:“承诺”仅指一种类型,但在此处用作值
Posted
技术标签:
【中文标题】打字稿:错误 TS2693:“承诺”仅指一种类型,但在此处用作值【英文标题】:typescript: error TS2693: 'Promise' only refers to a type, but is being used as a value here 【发布时间】:2017-08-24 10:55:39 【问题描述】:我正在尝试为我的 AWS Lambda 使用 Typescript,但我在使用 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
,
...
我尝试了I get: [ts] 'Promise' only refers to a type, but is being used as a value here 中提到的解决方案,但没有成功。
【问题讨论】:
传入Promise构造函数的回调函数不需要返回值。摆脱return
。
你是这个意思吗? responsePromise = new Promise((resolve, reject) => reject(new Error("missing is needed data")))
我试过了。但它并没有解决这个问题。
是的。 javascript 不关心你是否返回一个值,但它不会关注它。然而,TypeScript 确实在乎。
知道了。但是为什么 tsc 无法编译任何风格的 Promose.resolve 或 Promise.reject?
那个,我不知道。 responsePromise
究竟是如何声明的?
【参考方案1】:
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
已经过时了。亚马逊提供带有 official SDK 的 Typescript 类型。不需要DefiniteTyped。
这为我解决了问题中定义的确切错误,我只是导入 rxjs,甚至没有使用 Promis。非常感谢!
对于那些一开始就瞄准 es5 的人来说,这可能是最好的答案。从 es5 切换到 es2015 也为我解决了这个问题。但是请注意,在您关闭并重新启动 IDE/编辑器之前,您可能仍会看到该错误。关于 TSC(或它的监视模式)的某些东西使它看起来并没有真正修复它,而是需要重新启动 vscode。
update/addendum:如果您仍然想以 es5 为目标(以获得更好的浏览器支持,这很重要),只要您在编译器选项中提供它,它仍然可以工作:"lib" : [" es2015", "dom", "ScriptHost"],对我来说,诀窍是意识到我必须重新启动 VSCode 编辑器,然后才能在进行更改后开始工作。【参考方案2】:
今天遇到同样的错误并解决了:
npm i --save-dev @types/es6-promise
更新:
添加:
import Promise from 'es6-promise'
【讨论】:
+ 并在安装类型后重新启动 VS Code 也有帮助 勘误:使用这条线import Promise from 'es6-promise'
;
在哪里添加“import Promise from 'es6-promise'”?
我过去曾使用过此解决方案,但目前对我不起作用。但是,import Promise from '../node_modules/es6-promise/es6-promise';
似乎工作正常。为什么 TS 会找不到安装的类型?【参考方案3】:
我通过将以下代码添加到 tsconfig.json 文件解决了这个问题。
"lib": [
"ES5",
"ES2015",
"DOM",
"ScriptHost"]
【讨论】:
这对我有用,但请注意“lib”数组需要位于 tsconfig.json 文件中的“compilerOptions”对象内。 使用 TypeScript 2.4.1 我必须将字符串数组中的所有字符都更改为小写。然后它起作用了。非常感谢。【参考方案4】:通过更改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
【讨论】:
【参考方案5】:这是我的建议。使用 vscode 1.21.1 测试(在 MAC 上)
把下面的配置放到tsconfig.json
"lib": [
"es2016",
"dom"
]
进入 编译器选项
重启 IDE(此操作是必需的:D)
【讨论】:
这在此处的多个答案中列出,并且肯定重要:“重新启动 IDE(此操作是必需的)”【参考方案6】:我遇到了这个错误,但是我通过使用这个命令解决了它,我的 ts 文件名是 promises-fs.ts:
tsc promises-fs.ts --target es6 && node promises-fs.js
错误消失了
【讨论】:
【参考方案7】:我在index.ts
中使用这些组合属性消除了同样的错误:
在 tsconfig.json 中:
"compilerOptions":
"target": "ES6"
在 package.json 中:
"main": "index.ts",
"scripts":
"start": "tsc -p tsconfig.json && node index.js"
【讨论】:
【参考方案8】:在 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"]
【讨论】:
【参考方案9】:将下面的行添加到引发错误的文件中。这应该可以解决问题
declare var Promise: any;
P.S:这绝对不是最优解
【讨论】:
这只是删除“Promise”的类型检查,而不是修复它以便 Typescript 找到正确的类型。 此解决方法不适用于例如 Internet Explorer 11。尝试使用 Promise 时抛出“未定义”错误。无论如何,使用 Chrome 的解决方法可以完成他的工作。 这是个懦夫的出路。如果您要做这样的事情,为什么要使用TS
。我的意思是那有什么意义呢?!
我同意这不是最优的,但是说这个声明意味着使用 TS 没有意义是不公平的。在 one 类型上删除类型检查不会使其余类型检查无用。对我来说,这是唯一有效的解决方案。
可能是一个肮脏的黑客,但在我尝试了此页面上的所有其他解决方案之后,这是唯一对我有用的方法。至少我的代码已经编译并且可以工作了。我挖掘了有效的肮脏技巧。【参考方案10】:
最后 tsc 开始工作,没有任何错误。但多变。感谢Sandro Keil、Pointy & unional
已删除 dt~aws-lambda 删除了 noEmit、declaration 等选项 修改了 Gruntfile 并删除了 ignoreSettingstsconfig.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"
,
...
【讨论】:
【参考方案11】:打字稿和aws-sdk
有同样的问题。解决方法是将目标更改为es6
。
我完整的tsconfig.json
文件:
compilerOptions:
outDir: ./dist/,
sourceMap: true,
noImplicitAny: true,
module: commonjs,
target: es6,
jsx: react,
allowJs: true
,
include: [
./src/**/*
]
【讨论】:
是的,以 es6 为目标应该可以修复它,但是您的浏览器兼容性较差。大多数应用程序今天仍然以 es5 为目标,因为许多浏览器还没有在 es6 上(截至 2017 年) @user2080225 虽然这是真的,但它并没有让我的回答变得不那么正确,因为最初的问题没有说明任何关于浏览器兼容性的内容。因此,这个解决方案仍然可以帮助像它帮助我一样的其他人。【参考方案12】:好吧,这可能违反直觉,但我解决了这个问题,将esnext
添加到我的lib
。
"compilerOptions":
"lib": [
"esnext"
],
"target": "es5",
编译器建议的修复是
尝试将
lib
编译器选项更改为 es2015 或更高版本。
【讨论】:
【参考方案13】: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.`
【讨论】:
【参考方案14】:如果您在项目中使用DefinitelyTyped 存储库,您可能会遇到this recent issue。
您可能会使用的一个不错的解决方法(除了等待定义文件的更新构建或重构您的 TS 代码)是为 core-js 类型指定显式版本+构建,而不是让 Visual Studio 选择最新的/最近的一个。我发现了一个似乎不受此问题影响的问题(至少在我的情况下),您可以使用它替换 package.json 文件中的以下行:
"scripts":
"postinstall": "typings install dt~core-js --global"
用下面的一个:
"scripts":
"postinstall": "typings install dt~core-js@0.9.7+20161130133742 --global"
这彻底解决了我的问题。但是,强烈建议在问题发布后立即删除显式版本+构建引用。
关于这个问题的更多信息,你也可以read this blog post我写的关于这个话题。
【讨论】:
【参考方案15】:我遇到了同样的错误,我用这个配置修复了它:
文件:tsconfig.json
"compilerOptions":
"target": "es2015",
"module": "commonjs",
"strict": true,
"esModuleInterop": true
【讨论】:
【参考方案16】:请注意,如果您使用文件名运行 tsc 命令:
tsc testfile.ts
则忽略 tsconfig.json 编译器配置文件。 解决方案是单独运行 tsc 命令,在这种情况下,将编译目录中的所有 .ts 文件,除非您已编辑 tsconfig.json 以包含一组文件。
请参阅“使用文件属性”... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html
【讨论】:
【参考方案17】:我遇到了同样的问题,这让我在第二个问题中解脱了:
在控制台中这样写:
npm i --save bluebird
npm i --save-dev @types/bluebird @types/core-js@0.9.36
在问题所在的文件中复制粘贴:
import * as Promise from 'bluebird';
【讨论】:
【参考方案18】:只需在 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"
]
【讨论】:
【参考方案19】:npm i --save-dev @types/es6-promise
在 up 命令之后,你最好检查 tsconfig.json 确保“target”必须大于“es6”。可能 tsc 还不支持 es5。
【讨论】:
【参考方案20】:这里投票赞成的答案都不适合我。这是一个有保障且合理的解决方案。将它放在任何使用 Promise 的代码文件的顶部附近...
declare const Promise: any;
【讨论】:
不,不要这样做......或者如果你打算做这样的事情就不要使用打字稿【参考方案21】:花了很多时间试图解决这个问题。我在这里或其他地方提供的任何解决方案都没有运气。
但后来意识到这不仅仅是解决问题。但您还需要重新启动 VSCODE 才能使其生效。
【讨论】:
【参考方案22】:这里同样的错误。我在 tsconfig 中使用 "module": "ES6" 解决了这个问题。
【讨论】:
以上是关于打字稿:错误 TS2693:“承诺”仅指一种类型,但在此处用作值的主要内容,如果未能解决你的问题,请参考以下文章
为啥 TypeScript 中的 'instanceof' 会给我错误“'Foo' 仅指一种类型,但在这里被用作值。”?