打字稿:错误 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 并删除了 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"
                
            ,
...

【讨论】:

【参考方案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:“承诺”仅指一种类型,但在此处用作值的主要内容,如果未能解决你的问题,请参考以下文章

打字稿错误:“”仅指一种类型,但在此处用作命名空间

将 Require 语句替换为 Import 语句导致错误

为啥 TypeScript 中的 'instanceof' 会给我错误“'Foo' 仅指一种类型,但在这里被用作值。”?

仅指一种类型,但在此处用作值

错误:参数“e”隐式具有“任何”类型。 TS7006 - 反应打字稿

打字稿错误 TS2345 错误:TS2345:“缓冲区”类型的参数不可分配给“字符串”类型的参数