typescript: error TS2693: 'Promise' อ้างถึงประเภทเท่านั้น แต่มีการใช้เป็นค่าที่นี่


144

ฉันกำลังพยายามใช้ typescript สำหรับ AWS Lambda ของฉันและฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันใช้สัญญา

ข้อผิดพลาด TS2693: 'สัญญา' หมายถึงประเภทเท่านั้น แต่มีการใช้เป็นค่าที่นี่

ฉันลองใช้รูปแบบต่าง ๆ ต่อไปนี้ในรหัส

ใช้คอนสตรัคสัญญา

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

ใช้ Promise.reject

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

รุ่น

ต่อไปนี้เป็นรุ่นในการอ้างอิง dev ของฉัน:

"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
                }
            },
...

ฉันลองด้วยวิธีแก้ปัญหาที่กล่าวถึงในที่ฉันได้รับ: [ts] 'Promise' อ้างถึงประเภทเท่านั้น แต่มีการใช้เป็นค่าที่นี่แต่ไม่มีโชค


1
ไม่จำเป็นต้องส่งคืนค่าใด ๆ สำหรับฟังก์ชันการเรียกกลับที่ส่งผ่านไปยังตัวสร้างสัญญา returnเพียงกำจัด
Pointy

คุณหมายถึงอย่างนี้หรือไม่? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})ฉันลองแล้ว แต่มันก็ไม่ได้มีปัญหา
kalyanvgopal

ใช่. JavaScript ไม่สนใจว่าคุณจะส่งคืนค่าหรือไม่ แต่จะไม่สนใจมัน อย่างไรก็ตาม TypeScript มีหน้าที่ดูแล
แหลม

เข้าใจแล้ว แต่ทำไม tsc จึงไม่สามารถรวบรวมรสชาติของ Promose.resolve หรือ Promise.reject ใด ๆ
kalyanvgopal

นั่นฉันไม่รู้ มีการresponsePromiseประกาศอย่างไร
Pointy

คำตอบ:


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 อย่างเป็นทางการ ไม่จำเป็นต้องพิมพ์ Definitely
Sandro Keil

ที่แก้ไขข้อผิดพลาดที่แน่นอนที่กำหนดไว้ในคำถามสำหรับฉันและฉันเพิ่งจะนำเข้า rxjs ไม่ได้ใช้ Promis ขอบคุณมาก!
muzurB

3
นี่อาจเป็นคำตอบที่ดีที่สุดสำหรับผู้ที่กำหนดเป้าหมาย es5 เพื่อเริ่มต้น การเปลี่ยนจาก es5 เป็น es2015 ยังแก้ไขสิ่งนี้ให้ฉันด้วย ได้รับการเตือนอย่างไรก็ตามคุณอาจยังคงเห็นข้อผิดพลาดจนกว่าคุณจะปิดและรีสตาร์ท IDE / ตัวแก้ไขของคุณ มีบางอย่างเกี่ยวกับ TSC (หรือโหมดการเฝ้าดู) กำลังทำให้ดูเหมือนว่านี่ไม่ได้แก้ไขเมื่อมันเป็นจริง แต่ต้องเริ่มต้น vscode ใหม่

7
อัปเดต / ภาคผนวก: หากคุณต้องการกำหนดเป้าหมาย es5 (เพื่อการสนับสนุนเบราว์เซอร์ที่ดีขึ้นและเป็นสิ่งสำคัญ) ที่ยังคงทำงานตราบเท่าที่คุณให้สิ่งนี้ในตัวเลือกคอมไพเลอร์ของคุณ: "lib": ["es2015", "dom", " ScriptHost "], เคล็ดลับสำหรับฉันคือการตระหนักว่าฉันต้องรีสตาร์ทโปรแกรมแก้ไข VSCode ก่อนที่มันจะเริ่มทำงานหลังจากทำการเปลี่ยนแปลงนั้น

83

พบข้อผิดพลาดเดียวกันวันนี้และแก้ไขด้วย:

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

ปรับปรุง:

เพิ่ม:

import {Promise} from 'es6-promise'

3
+ และการรีสตาร์ท VS Code ก็ช่วยได้เช่นกันหลังจากการติดตั้งประเภท
ตำนาน

4
erratum: มันทำงานโดยใช้บรรทัดนี้ import {Promise} from 'es6-promise';
Loic Coenen

จะเพิ่ม "นำเข้า {Promise} จาก" es6-contract "ได้ที่ไหน
bArraxas

ฉันเคยใช้วิธีแก้ปัญหานี้ในอดีต แต่มันไม่ได้ผลสำหรับฉันในขณะนี้ import { Promise } from '../node_modules/es6-promise/es6-promise';อย่างไรก็ตามดูเหมือนว่าจะทำงานได้ดี เหตุใด TS จึงไม่สามารถค้นหาการพิมพ์ที่ติดตั้งได้
snarf

35

ฉันแก้ไขได้โดยเพิ่มรหัสด้านล่างลงในไฟล์ tsconfig.json

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

3
สิ่งนี้ได้ผลสำหรับฉัน แต่โปรดทราบว่าอาร์เรย์ "lib" ต้องอยู่ภายในวัตถุ "compilerOptions" ในไฟล์ tsconfig.json
BillyRayCyrus

5
ใช้ TypeScript 2.4.1 ฉันต้องเปลี่ยนอักขระทั้งหมดในอาร์เรย์สตริงให้เป็นตัวพิมพ์เล็ก จากนั้นก็ใช้งานได้ ขอบคุณมาก.
JDTLH9

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 ของฉันคือ contract-fs.ts:

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

และข้อผิดพลาดจะหายไป


5

เพิ่มบรรทัดด้านล่างลงในไฟล์ที่มีการโยนข้อผิดพลาดซึ่งควรแก้ไขปัญหา

declare var Promise: any;

PS:นี่ไม่ใช่ทางออกที่ดีที่สุดแน่นอน


18
นี่เป็นเพียงการลบการตรวจสอบประเภทสำหรับ 'สัญญา' แทนที่จะแก้ไขเพื่อให้ typescript ค้นหาประเภทที่ถูกต้อง
edibleEnergy

1
วิธีแก้ปัญหานี้ไม่ทำงานกับ Internet Explorer 11 เช่น ฉันส่งข้อผิดพลาด 'ไม่ได้กำหนด' เมื่อพยายามใช้ Promise อย่างไรก็ตามด้วย Chrome การแก้ปัญหาก็ทำหน้าที่ของเขา
Calin Vlasin

1
นั่นเป็นวิธีที่ขี้ขลาด ทำไมต้องใช้TSถ้าคุณจะทำอะไรแบบนี้ ฉันหมายความว่าเป็นประเด็นแล้ว!
Hafiz Temuri

1
ฉันยอมรับว่าสิ่งนี้ไม่เหมาะสม แต่ไม่ยุติธรรมที่จะบอกว่าการประกาศนี้หมายความว่าไม่มีประโยชน์ในการใช้ TS การดร็อป typecheck บนหนึ่งประเภทไม่ทำให้การตรวจสอบ type ที่เหลือไม่มีประโยชน์ และสำหรับฉันนี่เป็นทางออกเดียวที่ทำงานได้
Thorkil Værge

อาจเป็นแฮ็คที่สกปรก แต่เป็นสิ่งเดียวที่ใช้ได้ผลกับฉันหลังจากที่ฉันลองใช้วิธีแก้ไขปัญหาอื่น ๆ ทั้งหมดในหน้านี้ อย่างน้อยฉันก็รวบรวมรหัสและใช้งานได้ ฉันขุดแฮ็กสกปรกที่ทำงาน
Jeremy Thille

4

ในที่สุด tsc เริ่มทำงานโดยไม่มีข้อผิดพลาดใด ๆ แต่การเปลี่ยนแปลงหลายอย่าง ขอบคุณSandro Keil , Pointy & unional

  • ลบ dt ~ aws-lambda
  • ตัวเลือกลบออกเช่น noEmit การประกาศ
  • แก้ไข Gruntfile และลบการตั้งค่าละเว้น

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
ใช่ tartgeting es6 ควรแก้ไข แต่คุณมีความเข้ากันได้ของเบราว์เซอร์น้อยลง แอพส่วนใหญ่ยังคงเป็นเป้าหมายของ es5 อยู่ในปัจจุบันเนื่องจากเบราว์เซอร์จำนวนมากยังไม่ได้ใช้งานบน es6 (จนถึงปี 2017)

@ user2080225 แม้ว่าจะเป็นจริง แต่ก็ไม่ได้ทำให้คำตอบของฉันถูกต้องน้อยลงเนื่องจากคำถามเดิมไม่ได้ระบุอะไรเกี่ยวกับความเข้ากันได้ของเบราว์เซอร์ ดังนั้นวิธีแก้ปัญหานี้ยังสามารถช่วยเหลือผู้อื่นได้เช่นเดียวกับที่ช่วยฉัน
Fanus du Toit

3

ฉันมีปัญหาเดียวกันจนกระทั่งฉันเพิ่มอาร์เรย์ lib ต่อไปนี้ใน 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

อย่างนี้อาจจะมีเคาน์เตอร์ แต่ฉันจะแก้ไขนี้การเพิ่มของฉันesnextlib

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

การแก้ไขตามที่คอมไพเลอร์แนะนำให้ทำคือ

ลองเปลี่ยนตัวlibเลือกคอมไพเลอร์เป็น es2015 หรือใหม่กว่า


1

Core-js ไม่ทำงานสำหรับฉันเพราะมันทำให้เกิดปัญหาอื่น ๆ แต่เพียงติดตั้งเวอร์ชันล่าสุดเพื่อnpm i @types/es6-promise --save-devกำจัดปัญหา ปัญหาสำหรับฉันเกิดจากการรวบรวม sdk ที่ใช้ rxjs นี่คือข้อผิดพลาดที่ฉันได้รับ:

`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ในโครงการของคุณคุณอาจประสบปัญหาล่าสุดนี้ปัญหาล่าสุดนี้

วิธีแก้ปัญหาที่เหมาะสมที่คุณอาจใช้ (นอกเหนือจากการรอการสร้างไฟล์คำจำกัดความที่ได้รับการปรับปรุงหรือ refactoring รหัส TS ของคุณ) คือการระบุ version + build ที่ชัดเจนสำหรับการพิมพ์ core-js แทนที่จะปล่อยให้ Visual Studio เลือกล่าสุด / ล่าสุด . ฉันพบหนึ่งที่ดูเหมือนจะไม่ได้รับผลกระทบจากปัญหานี้ (ในกรณีของฉันอย่างน้อย) คุณสามารถใช้มันแทนบรรทัดต่อไปนี้จากไฟล์package.jso n ของคุณ:

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

ด้วยหนึ่งต่อไปนี้:

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

นี่เป็นการแก้ไขปัญหาของฉันให้ดี อย่างไรก็ตามขอแนะนำเป็นอย่างยิ่งให้ลบการอ้างอิงรุ่น + build อย่างชัดเจนทันทีที่ปัญหานี้จะได้รับการเผยแพร่

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับปัญหานี้คุณสามารถอ่านโพสต์บล็อกนี้ที่ฉันเขียนไว้ในหัวข้อ


0

ฉันมีปัญหาเดียวกันและสิ่งนี้ช่วยฉันให้รอดพ้นจากปัญหาในไม่ช้า:

เขียนในคอนโซลนี้:

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

ในไฟล์ที่มีปัญหาคัดลอกวางนี้:

import * as Promise from 'bluebird';

0

เพียงเปลี่ยนเป้าหมายเป็น "ES2017" ในไฟล์ tsconfig.json

นี่คือไฟล์ 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-contract

คำสั่ง after up คุณควรตรวจสอบ tsconfig.json ให้ดียิ่งขึ้นว่า "เป้าหมาย" ต้องดีกว่า "es6" บางที tsc ยังไม่รองรับ es5


0

ไม่มีคำตอบที่โหวตแล้วที่นี่ใช้ได้สำหรับฉัน นี่คือทางออกที่รับประกันและสมเหตุสมผล วางสิ่งนี้ไว้ที่ด้านบนสุดของไฟล์รหัสใด ๆ ที่ใช้ Promise ...

declare const Promise: any;

2
ไม่อย่าทำ ... หรืออย่าใช้ตัวพิมพ์หากคุณกำลังจะทำสิ่งนี้
Hafiz Temuri

0

ต้องใช้เวลามากมายในการพยายามแก้ไขปัญหานี้ ฉันไม่มีโชคกับการแก้ปัญหาใด ๆ ที่นี่หรือที่อื่น

แต่ต่อมาก็ตระหนักว่ามันไม่ได้เป็นเพียงแค่การแก้ปัญหา แต่คุณต้องรีสตาร์ท VSCODE เพื่อให้มีผล


0

ฉันมีข้อผิดพลาดเดียวกันและฉันแก้ไขด้วยการกำหนดค่านี้:

ไฟล์: tsconfig.json

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

0

โปรดทราบว่าหากคุณใช้คำสั่ง tsc ด้วยชื่อไฟล์เช่น:

tsc testfile.ts

ดังนั้นไฟล์คอนฟิกูเรชันคอมไพเลอร์ tsconfig.json จะถูกข้าม วิธีแก้ไขคือรันคำสั่ง tsc ด้วยตัวเองซึ่งในกรณีนี้ไฟล์. ts ทั้งหมดในไดเรกทอรีจะถูกรวบรวมเว้นแต่คุณจะแก้ไข tsconfig.json เพื่อรวมชุดไฟล์

ดู 'การใช้คุณสมบัติไฟล์' ... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html


0

ข้อผิดพลาดเดียวกันที่นี่ ฉันแก้ไขสิ่งนี้โดยใช้ "module": "ES6" ใน tsconfig


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.