typecript: error TS2693: 'Promise' chỉ đề cập đến một loại, nhưng đang được sử dụng làm giá trị ở đây


144

Tôi đang cố gắng sử dụng Bản mô tả cho AWS Lambda của mình và tôi đang gặp phải các lỗi sau khi sử dụng lời hứa.

lỗi TS2693: 'Promise' chỉ đề cập đến một loại, nhưng đang được sử dụng làm giá trị ở đây.

Tôi đã thử sử dụng các biến thể sau đây trong mã

Sử dụng hàm tạo Promise

responsePromise = new Promise((resolve, reject) => {
                    return reject(new Error(`missing is needed data`))
                })

sử dụng Promise.reject

responsePromise = Promise.reject(new Error(`Unsupported method "${request.httpMethod}"`));

Phiên bản

Sau đây là các phiên bản trong phụ thuộc dev của tôi:

"typescript": "^2.2.2"
"@types/aws-lambda": "0.0.9",
"@types/core-js": "^0.9.40",
"@types/node": "^7.0.12",

Nội dung của 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"
    ]
}

Tôi đang sử dụng grunt-ts với cấu hình sau để chạy tác vụ ts.

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

Tôi đã thử với giải pháp được đề cập trong tôi nhận được: [ts] 'Promise' chỉ đề cập đến một loại, nhưng đang được sử dụng như một giá trị ở đây nhưng không có may mắn.


1
Không có giá trị trả về là cần thiết cho hàm gọi lại được chuyển đến hàm tạo Promise. Chỉ cần thoát khỏi return.
Pointy

Bạn có nghĩa là như thế này? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})Tôi đã thử nó. Nhưng nó không phải là vấn đề.
kalyanvgopal 30/03/2017

Đúng. JavaScript không quan tâm bạn có trả lại giá trị hay không, nhưng nó sẽ không chú ý đến nó. TypeScript, tuy nhiên, không quan tâm.
chóp

Hiểu rồi. Nhưng tại sao tsc không biên dịch bất kỳ hương vị nào của Promose.resolve hoặc Promise.reject?
kalyanvgopal 30/03/2017

Điều đó, tôi không biết. Làm thế nào chính xác được responsePromisetuyên bố?
Pointy

Câu trả lời:


122

Tôi đã có cùng một vấn đề với aws-sdkvà tôi đã giải quyết nó bằng cách sử dụng "target": "es2015". Đây là tsconfig.jsontập tin của tôi .

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

5
Cảm ơn Sandro. Đã thử tương tự nhưng không giúp đỡ trong trường hợp của tôi.
kalyanvgopal 30/03/2017

Có lẽ đã @types/aws-lambdahết hạn. Amazon vận chuyển các loại Bản in với SDK chính thức . Không cần cho DefiniteTyped.
Sandro Keil

Điều đó đã giải quyết lỗi chính xác được xác định trong câu hỏi cho tôi và tôi chỉ đang nhập rxjs, thậm chí không sử dụng Promis. Cám ơn rất nhiều!
muzurB

3
Đây có lẽ là câu trả lời tốt nhất cho những người đã nhắm mục tiêu es5 để bắt đầu. Chuyển từ es5 sang es2015 cũng đã sửa lỗi này cho tôi. Tuy nhiên, được cảnh báo, bạn có thể vẫn sẽ thấy lỗi cho đến khi bạn tắt và khởi động lại IDE / trình soạn thảo của mình. Một cái gì đó về TSC (hoặc đó là chế độ đồng hồ) đã làm cho có vẻ như điều này không khắc phục được khi nó thực sự, nhưng yêu cầu khởi động lại vscode.

7
update / addendum: nếu bạn muốn vẫn nhắm mục tiêu es5 (để hỗ trợ trình duyệt tốt hơn và quan trọng) vẫn hoạt động miễn là bạn cung cấp tùy chọn này trong các tùy chọn trình biên dịch của mình: "lib": ["es2015", "dom", " Scripthost "], mẹo cho tôi là nhận ra rằng tôi phải khởi động lại trình soạn thảo VSCode, trước khi nó bắt đầu hoạt động sau khi thực hiện thay đổi đó.

83

Gặp lỗi tương tự ngày hôm nay và giải quyết nó với:

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

Cập nhật:

thêm vào:

import {Promise} from 'es6-promise'

3
+ và khởi động lại Mã VS cũng giúp, sau khi cài đặt các loại
Huyền thoại

4
Erratum: Nó hoạt động bằng cách sử dụng dòng này import {Promise} from 'es6-promise';
Loic Coenen

nơi để thêm "nhập {Promise} từ 'es6-lời hứa'"?
bArraxas

Tôi đã sử dụng giải pháp này trong quá khứ, nhưng nó không hoạt động với tôi vào lúc này. import { Promise } from '../node_modules/es6-promise/es6-promise';Tuy nhiên, dường như đang hoạt động tốt. Tại sao TS không thể tìm thấy các kiểu chữ được cài đặt?
snarf

35

Tôi đã giải quyết điều này bằng cách thêm mã dưới đây vào tệp tsconfig.json.

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

3
điều này làm việc cho tôi, nhưng lưu ý rằng mảng "lib" cần phải nằm trong đối tượng "Trình biên dịch" trong tệp tsconfig.json.
BillyRayCyrus

5
Sử dụng TypeScript 2.4.1 tôi đã phải thay đổi tất cả các ký tự trong mảng chuỗi thành chữ thường. Sau đó, nó làm việc. Cảm ơn nhiều.
JDTLH9

18

Giải quyết bằng cách thay đổi mục tiêu trong trình biên dịchOptions.

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

Đây là mẹo của tôi. Đã thử nghiệm với vscode 1.21.1 (trên MAC)

Đặt cấu hình bên dưới vào tsconfig.json

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

vào trình biên dịchOptions

Khởi động lại IDE (hành động này là bắt buộc: D)


3
Điều này được liệt kê trong nhiều câu trả lời ở đây và điều quan trọng là chắc chắn: "Khởi động lại IDE (hành động này là bắt buộc)"
atconway

7

Tôi đã gặp lỗi này nhưng tôi đã khắc phục bằng cách sử dụng lệnh này, tên tệp ts của tôi là prom-fs.ts:

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

và lỗi đã biến mất


5

Thêm dòng dưới đây vào tập tin nơi lỗi được ném. Điều này sẽ khắc phục vấn đề

declare var Promise: any;

PS: Đây chắc chắn không phải là giải pháp tối ưu


18
Đây chỉ là loại bỏ kiểm tra loại cho 'Promise', thay vì sửa nó để Typecript tìm đúng loại.
ăn được

1
Cách giải quyết này không hoạt động với Internet Explorer 11 chẳng hạn. Tôi ném một lỗi 'không xác định' khi cố gắng sử dụng Promise. Dù sao với Chrome, cách giải quyết là công việc của anh ấy.
Calin Vlasin

1
đó là một cách hèn nhát. Tại sao sử dụng TSnếu bạn sẽ làm một cái gì đó như thế này. Ý tôi là sao rồi?!
Hafiz Temuri

1
Tôi đồng ý rằng điều này là không tối ưu nhưng thật không công bằng khi nói rằng tuyên bố này có nghĩa là không có điểm nào trong việc sử dụng TS. Bỏ các lỗi đánh máy trên một loại không làm cho phần còn lại của các lỗi đánh máy trở nên vô dụng. Và đối với tôi, đây là giải pháp duy nhất có hiệu quả.
Thorkil Værge

Có thể là một hack bẩn, nhưng đó là điều duy nhất có hiệu quả với tôi sau khi tôi thử tất cả các giải pháp khác trên trang này. Ít nhất tôi đã nhận được mã của tôi được biên dịch và làm việc. Tôi đào bới bẩn mà làm việc.
Jeremy Thille

4

Cuối cùng tsc bắt đầu làm việc mà không có lỗi. Nhưng nhiều thay đổi. Cảm ơn Sandro Keil , Pointy & unional

  • Đã xóa dt ~ aws-lambda
  • Các tùy chọn đã xóa như noEmit, khai báo
  • Gruntfile đã sửa đổi và loại bỏ bỏ qua Cài đặt

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

Có cùng một vấn đề với bản thảo và aws-sdk. Giải pháp là thay đổi mục tiêu thành es6.

tsconfig.jsonTập tin hoàn chỉnh của tôi :

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

3
Có tartgeting es6 nên sửa nó, nhưng sau đó bạn có ít khả năng tương thích trình duyệt. Hầu hết các ứng dụng ngày nay vẫn nhắm mục tiêu es5, vì nhiều trình duyệt vẫn chưa có trên es6 (kể từ năm 2017)

@ user2080225 mặc dù điều đó là đúng, nhưng điều đó không làm cho câu trả lời của tôi ít chính xác hơn vì câu hỏi ban đầu không nêu bất cứ điều gì về khả năng tương thích của trình duyệt. Vì vậy, giải pháp này vẫn có thể giúp những người khác như nó đã giúp tôi.
Fanus du Toit

3

Tôi gặp vấn đề tương tự cho đến khi tôi thêm mảng lib sau trong typeScript 3.0.1

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

Vâng, điều này có thể gây phản tác dụng trực quan nhưng tôi giải quyết này thêm esnextđể tôi lib.

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

FIX, theo đề xuất của trình biên dịch là

Hãy thử thay đổi libtùy chọn trình biên dịch sang es2015 trở lên.


1

Core-js không hoạt động với tôi vì nó gây ra các vấn đề khác, tuy nhiên, chỉ cần cài đặt phiên bản mới nhất để npm i @types/es6-promise --save-devloại bỏ các vấn đề. Các vấn đề đối với tôi bắt nguồn từ việc biên dịch một sdk đang sử dụng rxjs. Đây là lỗi tôi đã nhận được:

`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

Nếu bạn đang sử dụng kho lưu trữ DefiniteTyped trong dự án của mình, bạn có thể gặp phải sự cố gần đây này .

Một cách giải quyết tốt mà bạn có thể sử dụng (ngoài việc chờ bản dựng tệp định nghĩa được cập nhật hoặc tái cấu trúc mã TS của bạn) là chỉ định phiên bản rõ ràng + bản dựng cho kiểu chữ core-js thay vì để Visual Studio chọn bản mới nhất / mới nhất . Tôi đã tìm thấy một cái dường như không bị ảnh hưởng bởi vấn đề này (ít nhất là trong trường hợp của tôi), bạn có thể sử dụng nó để thay thế dòng sau từ tệp pack.jso n của bạn :

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

Với cái sau:

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

Điều này đã khắc phục vấn đề của tôi cho tốt. Tuy nhiên, rất khuyến khích xóa phiên bản rõ ràng + tham chiếu bản dựng ngay khi sự cố sẽ được phát hành.

Để biết thêm thông tin về vấn đề này, bạn cũng có thể đọc bài đăng blog này mà tôi đã viết về chủ đề này.


0

Tôi đã có cùng một vấn đề và điều này đã cứu tôi khỏi vấn đề thứ hai:

viết trong giao diện điều khiển này:

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

trong tập tin có vấn đề là sao chép dán này:

import * as Promise from 'bluebird';

0

Chỉ cần thay đổi mục tiêu thành "ES2017" trong tệp tsconfig.json.

đây là tập tin tsconfig.json của tôi

{
"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 @ type / es6-hứa

sau khi lên lệnh, bạn nên kiểm tra tsconfig.json tốt hơn để đảm bảo "mục tiêu" phải tuyệt vời hơn "es6". có lẽ tsc chưa hỗ trợ es5.


0

Không có câu trả lời nào được bình chọn ở đây làm việc cho tôi. Đây là một giải pháp đảm bảo và hợp lý. Đặt cái này ở gần đầu của bất kỳ tệp mã nào sử dụng Promise ...

declare const Promise: any;

2
Không, đừng làm điều này ... hoặc chỉ không sử dụng bản thảo nếu bạn sẽ làm một cái gì đó như thế này
Hafiz Temuri

0

Đã dành rất nhiều thời gian để cố gắng khắc phục điều này. Tôi không có may mắn với bất kỳ giải pháp cung cấp ở đây hoặc nơi khác.

Nhưng sau đó nhận ra rằng nó không chỉ là giải quyết vấn đề. Nhưng bạn cũng cần RESTART VSCODE để nó có ảnh hưởng.


0

Tôi đã có cùng một lỗi và tôi đã sửa nó với cấu hình này:

Tập tin: tsconfig.json

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

0

Xin lưu ý rằng nếu bạn đang chạy lệnh tsc với tên tệp tức là:

tsc testfile.ts

sau đó tệp cấu hình trình biên dịch tsconfig.json bị bỏ qua. Giải pháp là tự chạy lệnh tsc, trong trường hợp đó, tất cả các tệp .ts trong thư mục sẽ được biên dịch, trừ khi bạn đã chỉnh sửa tsconfig.json để bao gồm một tập hợp các tệp.

xem 'sử dụng thuộc tính tệp' ... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html


0

Lỗi tương tự ở đây. Tôi đã sửa lỗi này, sử dụng "mô-đun": "ES6" trong tsconfig.


0

Tôi đã thoát khỏi lỗi tương tự trong index.ts với các thuộc tính kết hợp này:

Trong tsconfig.json:

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

Và trong gói.json:

  "main": "index.ts",
  "scripts": {
    "start": "tsc -p tsconfig.json && node index.js"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.