【问题标题】:typescript: error TS2693: 'Promise' only refers to a type, but is being used as a value here打字稿:错误 TS2693:“承诺”仅指一种类型,但在此处用作值
【发布时间】: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 究竟是如何声明的?

标签: javascript typescript promise


【解决方案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 KeilPointy & 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" 解决了这个问题。

                              【讨论】:

                                猜你喜欢
                                • 2017-12-03
                                • 1970-01-01
                                • 2019-05-29
                                • 2020-04-15
                                • 2021-01-07
                                • 2019-02-02
                                • 1970-01-01
                                • 2018-09-26
                                • 2018-08-07
                                相关资源
                                最近更新 更多