टाइपस्क्रिप्ट: त्रुटि TS2693: 'प्रॉमिस' केवल एक प्रकार को संदर्भित करता है, लेकिन यहां एक मूल्य के रूप में उपयोग किया जा रहा है


144

मैं अपने एडब्ल्यूएस लैंबडा के लिए टाइपस्क्रिप्ट का उपयोग करने की कोशिश कर रहा हूं और मुझे निम्नलिखित त्रुटियां मिल रही हैं जहां मैं कभी भी वादों का उपयोग करता हूं।

त्रुटि 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}"`));

संस्करण

मेरी देव निर्भरताओं में संस्करण निम्नलिखित हैं:

"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 टास्क चलाने के लिए निम्न कॉन्फ़िगरेशन के साथ ग्रन्ट-टीएस का उपयोग कर रहा हूं।

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

मैंने प्राप्त किए गए समाधान के साथ कोशिश की : [ts] 'वादा' केवल एक प्रकार को संदर्भित करता है, लेकिन यहां एक मूल्य के रूप में उपयोग किया जा रहा है, लेकिन भाग्य नहीं।


1
प्रॉमिस कंस्ट्रक्टर में पारित कॉलबैक फ़ंक्शन के लिए कोई वापसी मूल्य की आवश्यकता नहीं है। बस छुटकारा मिल जाएगा return
नुकीले

क्या तुम्हारा यह मतलब था? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})मैं इसे करने की कोशिश की। लेकिन यह समस्या के साथ नहीं था।
कल्याणवगोपाल

हाँ। जावास्क्रिप्ट परवाह नहीं करता है कि आप एक मूल्य वापस करते हैं या नहीं, लेकिन यह उस पर ध्यान नहीं देगा। टाइपस्क्रिप्ट, हालांकि, देखभाल करता है।
नुकीले

समझ गया। लेकिन क्यों tsc Promose.resolve या Promise.reject के किसी भी स्वाद को संकलित करने में विफल रहता है?
kalyanvgopal

मुझे नहीं पता। वास्तव में कैसे 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
धन्यवाद सैंड्रो। कोशिश की लेकिन मेरे मामले में मदद नहीं की।
कल्याणगोपाल

शायद @types/aws-lambdaआउट ऑफ डेट हो। अमेजन के जहाज आधिकारिक एसडीके के साथ टाइपस्क्रिप्ट टाइप करते हैं । इसके लिए निश्चित रूप से कोई जरूरत नहीं है।
सैंड्रो केइल

यह मेरे लिए प्रश्न में परिभाषित सटीक त्रुटि को हल करता है और मैं सिर्फ rxjs आयात कर रहा था, प्रोमिस का उपयोग भी नहीं कर रहा था। बहुत बहुत धन्यवाद!
मुजुरबी

3
यह शायद उन लोगों के लिए सबसे अच्छा जवाब है जो शुरू करने के लिए es5 को लक्षित कर रहे थे। Es5 से es2015 पर स्विच करना मेरे लिए भी यही तय करता है। हालांकि, आपको चेतावनी दी जाती है कि आप तब भी त्रुटि देखेंगे जब तक कि आप अपना आईडीई / संपादक बंद नहीं कर देते। TSC (या यह वॉच मोड) के बारे में कुछ ऐसा प्रतीत हो रहा था कि यह इसे ठीक नहीं कर रहा था जब यह वास्तव में था, लेकिन इसे vscode के पुनः आरंभ की आवश्यकता थी।

7
अद्यतन / परिशिष्ट: यदि आप अभी भी es5 को लक्षित करना चाहते हैं (बेहतर ब्राउज़र समर्थन के लिए, और महत्वपूर्ण है) जो तब भी काम करता है जब तक आप इसे अपने संकलक विकल्पों में आपूर्ति करते हैं: "lib": ["es2015", "dom", " ScriptHost "], मेरे लिए ट्रिक मुझे अहसास करा रही थी कि मुझे VSCode संपादक को फिर से शुरू करना होगा, इससे पहले कि यह बदलाव करने के बाद काम करना शुरू कर दे।

83

आज उसी त्रुटि का सामना करें और इसे हल करें:

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

अपडेट करें:

जोड़ें:

import {Promise} from 'es6-promise'

3
+ और वी.एस. कोड को फिर से शुरू करना भी प्रकारों की स्थापना के बाद मदद करता है
महापुरूष

4
इरेटम: यह इस लाइन का उपयोग करके काम करता है import {Promise} from 'es6-promise';
लोजिक कोएनन

"es6-वादा '" से "आयात {वादा} कैसे जोड़ें?"
बैराक्सस

मैंने अतीत में इस समाधान का उपयोग किया है, लेकिन यह फिलहाल मेरे लिए काम नहीं कर रहा है। import { Promise } from '../node_modules/es6-promise/es6-promise';हालाँकि, लगता है कि ठीक काम कर रहा है। टीएस स्थापित टंकण खोजने में असमर्थ क्यों होगा?
snarf

35

मैंने इसे tsconfig.json फ़ाइल के नीचे कोड जोड़कर हल किया।

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

3
यह मेरे लिए काम करता है, लेकिन ध्यान दें कि "lib" सरणी को tsconfig.json फ़ाइल में "compilerOptions" ऑब्जेक्ट के अंदर होना चाहिए।
बिली रेयर साइरस

5
टाइपस्क्रिप्ट 2.4.1 के उपयोग से मुझे स्ट्रिंग ऐरे में सभी पात्रों को लोअरकेस में बदलना पड़ा। फिर काम हुआ। बहुत धन्यवाद।
JDTLH9

18

संकलक में लक्ष्य बदलकर हल किया ।

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

यहाँ मेरी टिप है। बनाम 1.21.1 के साथ परीक्षण किया गया (मैक पर)

विन्यास को tsconfig.json के नीचे रखें

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

में compilerOptions

IDE को पुनरारंभ करें (यह क्रिया आवश्यक है: D)


3
यह यहाँ कई उत्तरों में सूचीबद्ध है और यह सुनिश्चित करने के लिए महत्वपूर्ण है: "रीस्टार्ट आईडीई (यह कार्रवाई आवश्यक है)"
atconway

7

मेरे पास यह त्रुटि थी, लेकिन मैंने इस आदेश का उपयोग करके इसे हल किया, मेरा ts फ़ाइल नाम वादे-एफएसटी है:

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

और त्रुटि हो गई है


5

फ़ाइल को नीचे पंक्ति में जोड़ें जहां त्रुटि डाली जा रही है। इस समस्या को ठीक करना चाहिए

declare var Promise: any;

पुनश्च: यह निश्चित रूप से इष्टतम समाधान नहीं है


18
यह 'प्रॉमिस' के लिए केवल टाइप चेक को हटा रहा है, इसे ठीक करने के बजाय टाइपस्क्रिप्ट सही प्रकार पाता है।
edibleEnergy

1
यह वर्कअराउंड उदाहरण के लिए Internet Explorer 11 के साथ काम नहीं करता है। प्रॉमिस का उपयोग करने की कोशिश करते समय मैं एक 'अपरिभाषित' त्रुटि फेंकता हूं। वैसे भी क्रोम के साथ वर्कअराउंड अपना काम करता है।
कैलिन व्लासिन

1
यह एक कायर रास्ता है। TSअगर आप ऐसा कुछ करने जा रहे हैं तो क्यों इस्तेमाल करें। मेरा मतलब है कि फिर क्या बात है ?!
हाफिज तेमुरी

1
मैं सहमत हूं कि यह इष्टतम नहीं है, लेकिन यह कहना अनुचित है कि इस घोषणा का मतलब है कि टीएस का उपयोग करने का कोई मतलब नहीं है। एक प्रकार पर टंकण को ​​छोड़ना बाकी के टंकणों को बेकार नहीं बनाता है। और मेरे लिए, यह एकमात्र समाधान था जिसने काम किया।
थोरकिल वोरगे

मैं एक गंदा हैक हो सकता हूं, लेकिन इस पृष्ठ पर अन्य सभी समाधानों की कोशिश करने के बाद ही मेरे लिए काम आया। कम से कम मुझे अपना कोड संकलित करने और काम करने में मिला। मैं उस काम को गंदे हैक खोदता हूं।
जेरेमी थिल्ले

4

अंत में tsc ने बिना किसी त्रुटि के काम करना शुरू कर दिया। लेकिन कई बदलाव। के लिए धन्यवाद सैंड्रो Keil , नुकीले और unional

  • हटाए गए dt ~ aws-lambda
  • नोइमिट, डिक्लेरेशन जैसे ऑप्शन को हटा दिया
  • संशोधित ग्रंटफाइल और अनदेखी को हटा दिया गया

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

टाइपस्क्रिप्ट और के साथ एक ही मुद्दा था 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 हालांकि यह सच है, यह मेरे जवाब को सही नहीं बनाता है क्योंकि मूल प्रश्न ब्राउज़र संगतता के बारे में कुछ भी नहीं बताता है। इसलिए यह समाधान अभी भी दूसरों की मदद कर सकता है जैसे कि इसने मेरी मदद की।
फानूस डू टिट

3

जब तक मैंने टाइपस्क्रिप्ट 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

खैर, यह जवाबी कार्रवाई हो सकती है, लेकिन मैंने इसे esnextअपने हल में जोड़ लिया lib

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

FIX, जैसा कि संकलक द्वारा सुझाया गया है

libEs2015 या बाद के संकलक विकल्प को बदलने का प्रयास करें ।


1

कोर-जेएस ने मेरे लिए काम नहीं किया क्योंकि यह अन्य मुद्दों का कारण बना, हालांकि, मुद्दों 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

यदि आप निश्चित रूप से अपनी परियोजना में निश्चित रूप से रिपोजिटरी का उपयोग कर रहे हैं तो आप इस हालिया मुद्दे का अनुभव कर सकते हैं ।

आपके द्वारा उपयोग किए जा सकने वाले एक सभ्य वर्कअराउंड का उपयोग (परिभाषा फ़ाइल की अद्यतन बिल्ड के लिए प्रतीक्षा करने या अपने टीएस कोड को फिर से भरने के अलावा) एक स्पष्ट संस्करण को निर्दिष्ट करने के लिए है + कोर-जेएस टाइपिंग के लिए निर्माण के बजाय विज़ुअल स्टूडियो को नवीनतम / सबसे हाल ही में लेने दें। । मैंने पाया कि इस समस्या से अप्रभावित प्रतीत होता है (कम से कम मेरे मामले में), आप इसका उपयोग अपने पैकेज से निम्नलिखित पंक्ति को बदलने के लिए कर सकते हैं n 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

बस लक्ष्य को "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 @ प्रकार / es6-वादा

कमांड के बाद, आप tsconfig.json को बेहतर तरीके से जांचेंगे कि "es6" की तुलना में "लक्ष्य" महान होना चाहिए। शायद tsc अभी तक es5 का समर्थन नहीं करता है।


0

यहां कोई भी अप-वोट का जवाब मेरे लिए काम नहीं करता है। यहाँ एक गारंटीकृत और उचित समाधान है। इसे किसी भी कोड फ़ाइल के शीर्ष के पास रखें जो वादा करता है ...

declare const Promise: any;

2
नहीं, यह मत करो ... या बस टाइपस्क्रिप्ट का उपयोग न करें यदि आप ऐसा कुछ करने जा रहे हैं
हाफिज टेमुरी

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-j.html


0

यहाँ वही त्रुटि। मैंने इसे "मॉड्यूल" का उपयोग करके तय किया: tsconfig में "ES6"।


0

मुझे उसी त्रुटि से छुटकारा मिला index.ts इन संयुक्त गुणों के साथ :

Tsconfig.json में:

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

और package.json में:

  "main": "index.ts",
  "scripts": {
    "start": "tsc -p tsconfig.json && node index.js"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.