typescript:エラーTS2693: 'Promise'はタイプのみを参照していますが、ここでは値として使用されています


144

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

tsタスクを実行するために、次の構成でgrunt-tsを使用しています。

ts: {
            app: {
                tsconfig: {
                    tsconfig: "./tsconfig.json",
                    ignoreSettings: true
                }
            },
...

私はで述べた溶液で試した私が手:[TS]「約束」はタイプを指しますが、ここでの値として使用されているが、運。


1
Promiseコンストラクターに渡されるコールバック関数には戻り値は必要ありません。ただ取り除くreturn
とがった

こんな意味ですか?responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})私はそれを試してみました。しかし、問題は解決しませんでした。
kalyanvgopal 2017年

はい。JavaScriptは、値を返すかどうかは関係ありませんが、注意を払うことはありません。ただし、TypeScriptは問題ありません。
ポインティ

とった。しかし、なぜtscは、Promose.resolveまたはPromise.rejectのフレーバーをコンパイルできないのですか?
kalyanvgopal 2017年

それはわかりません。どのように正確にresponsePromise宣言されていますか?
とがった

回答:


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はTypescriptタイプを公式SDKに同梱しています。DefinitelyTypedは必要ありません。
Sandro Keil 2017年

それは私のための質問で定義された正確なエラーを解決し、Promisを使用していなくても、rxjsをインポートしていました。本当にありがとう!
muzurB 2017年

3
これは、おそらくes5を最初からターゲットにしていた人にとって最良の答えです。es5からes2015に切り替えると、これも修正されました。ただし、IDE /エディターをシャットダウンして再起動するまで、エラーが表示される可能性があります。TSC(または時計モード)の問題により、実際には修正されていないように見えましたが、vscodeの再起動が必要でした。

7
update / addendum:es5をターゲットにしたい場合(より良いブラウザーサポートのために、そして重要です)、コンパイラーオプションでこれを指定する限り、これは機能します: "lib":["es2015"、 "dom"、 " ScriptHost "]、私にとってのトリックは、VSCodeエディターがその変更を行った後に機能し始める前に、再起動しなければならないことに気づいていたことです。

83

今日同じエラーに遭遇し、それでそれを解決しました:

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

更新:

追加:

import {Promise} from 'es6-promise'

3
+ VS Codeを再起動すると、タイプのインストール後も役立ちます
Legends

4
正誤表:この行を使用すると機能し import {Promise} from 'es6-promise'ます。
Loic Coenen

「インポート{Promise} from 'es6-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 2017

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

compilerOptions

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
Typescriptが正しいタイプを見つけるように修正するのではなく、「Promise」のタイプチェックを削除するだけです。
edibleEnergy 2017

1
この回避策は、たとえばInternet Explorer 11では機能しません。Promiseを使用しようとすると、「未定義」エラーがスローされます。とにかくChromeでは、回避策が彼の仕事をします。
Calin Vlasin

1
それは臆病な方法です。TSこのようなことを行う場合は、なぜを使用するのですか。では、何がポイントなのでしょうか。
Hafiz Temuri

1
これは最適ではないことに同意しますが、この宣言がTSを使用する意味がないと言うのは不当です。1つの型の型チェックを削除しても、残りの型チェックは役に立たなくなります。そして私にとって、これが機能した唯一のソリューションでした。
ThorkilVærge19年

汚いハックかもしれませんが、このページで他のすべての解決策を試した後、それは私にとってうまくいった唯一のものです。少なくとも、コードをコンパイルして機能させることができました。私はそれが機能する汚いハックを掘ります。
Jeremy Thille、

4

最後に、tscはエラーなしで動作し始めました。しかし、複数の変更。おかげサンドロKeil社先のとがっ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"
                }
            },
...

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をインストールすると問題が解決しますが、ブラウザの互換性が低下します。ほとんどのアプリは現在も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コードをリファクタリングする以外に)使用できる適切な回避策は、Visual Studioに最新/最新のものを選択させるのではなく、core-jsタイピングに明示的なバージョン+ビルドを指定することです。この問題の影響を受けていないようです(少なくとも私の場合)。これを使用して、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 i --save-dev @ types / es6-promise

upコマンドの後、tsconfig.jsonをチェックして、「ターゲット」が「es6」よりも大きいことを確認してください。おそらくtscはまだes5をサポートしていません。


0

ここで投票された答えはどれも私には役に立ちません。これが保証された合理的な解決策です。Promiseを使用するコードファイルの先頭近くに配置します...

declare const Promise: any;

2
いいえ、これを行わないでください。または、このようなことを行う場合は、typescriptを使用しないでください
Hafiz Temuri

0

これを修正するために多くの時間を費やした。私はここまたは他の場所で提供される解決策を持っていませんでした。

しかしその後、それは問題を解決するだけではないことに気付きました。ただし、VSCODEを有効にするには、VSCODEを再起動する必要もあります。


0

私は同じエラーがあり、この構成で修正しました:

ファイル:tsconfig.json

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

0

ファイル名を指定してtscコマンドを実行している場合は、次のことに注意してください。

tsc testfile.ts

その場合、tsconfig.jsonコンパイラー構成ファイルは無視されます。解決策は、tscコマンドを単独で実行することです。この場合、tsconfig.jsonを編集して一連のファイルを含めない限り、ディレクトリ内のすべての.tsファイルがコンパイルされます。

「ファイルプロパティの使用」を参照してください... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html



0

私はindex.tsこれらの結合されたプロパティでこの同じエラーを取り除きました:

tsconfig.jsonで:

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

そしてpackage.jsonで:

  "main": "index.ts",
  "scripts": {
    "start": "tsc -p tsconfig.json && node index.js"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.