typescript: error TS2693: 'Promise' sadece bir türe atıfta bulunur, ancak burada bir değer olarak kullanılıyor


144

Benim AWS Lambda için Typescript kullanmaya çalışıyorum ve söz verdiğim yerde aşağıdaki hataları alıyorum.

hata TS2693: 'Promise' sadece bir türü ifade eder, ancak burada bir değer olarak kullanılmaktadır.

Kodda aşağıdaki varyasyonları kullanarak denedim

Promise yapıcısını kullanma

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

Promise.reject kullanma

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

Sürümler

Benim dev bağımlılıkları benim sürümleri şunlardır:

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

Tsconfig.json içeriği

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

Ben görev çalıştırmak için aşağıdaki yapılandırma ile grunt-ts kullanıyorum.

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

Anladığım çözümle denedim : [ts] 'Promise' sadece bir türü ifade ediyor, ama burada bir değer olarak kullanılıyor ama şans yok.


1
Promise yapıcısına iletilen geri arama işlevi için herhangi bir dönüş değeri gerekmez. Sadece kurtul return.
Sivri

Böyle mi demek istiyorsun? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})Denedim. Ancak bu sorunla ilgilenmedi.
17:29, kalyanvgopal

Evet. JavaScript bir değer döndürüp döndürmemenizle ilgilenmez, ancak buna dikkat etmez. Ancak TypeScript önemser.
Sivri

Anladım. Ama neden tsc Promose.resolve veya Promise.reject'in herhangi bir lezzetini derlemiyor?
17:33 de kalyanvgopal

Bunu bilmiyorum. Tam olarak nasıl responsePromiseilan edilir?
Sivri

Yanıtlar:


122

İle aynı sorunu aws-sdkyaşadım ve kullanarak çözdüm "target": "es2015". Bu benim tsconfig.jsondosyam.

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

5
Teşekkürler Sandro. Aynı denedim ama benim durumumda yardımcı olmadı.
17:22 de kalyanvgopal

Belki @types/aws-lambdagüncel değil. Amazon, resmi SDK ile dizgi türleri gönderiyor . DefinitelyTyped'e gerek yok.
Sandro Keil

Bu benim için soruda tanımlanan kesin hatayı çözdü ve ben sadece Promis kullanarak değil, rxjs ithal ediyordum. Çok teşekkürler!
muzurB

3
Bu, muhtemelen es5'i hedeflemek isteyenler için en iyi cevaptır. Es5'ten es2015'e geçmek de bunu benim için düzeltti. Ancak, IDE / düzenleyicinizi kapatıp yeniden başlatana kadar hatayı hala göreceksiniz. TSC (veya izleme modu) ile ilgili bir şey, bunun gerçekten olduğu zaman bunu düzeltmediğini, ancak vscode'un yeniden başlatılmasını gerektirdiğini gösteriyor.

7
update / addendum: derleyici seçeneklerinizde bunu sağladığınız sürece hala es5'i hedeflemek istiyorsanız (daha iyi tarayıcı desteği için ve önemlidir): "lib": ["es2015", "dom", " ScriptHost "], Benim için hile, bu değişikliği yaptıktan sonra çalışmaya başlamadan önce VSCode editörünü yeniden başlatmam gerektiğini fark ediyordu.

83

Bugün aynı hatayla karşılaşın ve şu sorunu çözdü:

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

Güncelleme:

Ekle:

import {Promise} from 'es6-promise'

3
+ ve VS Code'u yeniden başlatmak, türlerin kurulumundan sonra da yardımcı olur
Efsaneler

4
Erratum: Bu çizgiyi kullanarak çalışır import {Promise} from 'es6-promise';
Loic Coenen

nereden "es6-promise" den {Promise} içe aktarmalı? "
bArraxas

Bu çözümü geçmişte kullandım, ama şu anda benim için çalışmıyor. import { Promise } from '../node_modules/es6-promise/es6-promise';Ancak, iyi çalışıyor gibi görünüyor. TS neden kurulu yazıları bulamıyor?
snarf

35

Bunu tsconfig.json dosyasına aşağıdaki kodu ekleyerek çözdüm.

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

3
bu benim için çalıştı, ancak "lib" dizisinin tsconfig.json dosyasındaki "compilerOptions" nesnesinin içinde olması gerektiğini unutmayın.
BillyRayCyrus

5
TypeScript 2.4.1 kullanarak dize dizisindeki tüm karakterleri küçük harf olarak değiştirmek zorunda kaldı. Sonra işe yaradı. Çok teşekkürler.
JDTLH9

18

CompilerOptions içindeki hedef değiştirilerek çözüldü .

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

İşte benim ipucum. Vscode 1.21.1 ile test edildi (MAC'de)

Tsconfig.json için aşağıdaki yapılandırmayı koy

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

içine compileroptions

IDE'yi yeniden başlatın (bu eylem gereklidir: D)


3
Bu, burada verilen cevapların
çoğunda

7

Bu hatayı aldım ama bu komutu kullanarak çözdüm, benim ts dosya adı promises-fs.ts:

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

ve hata gitti


5

Hatanın atıldığı dosyaya aşağıdaki satırı ekleyin.

declare var Promise: any;

Not: Bu kesinlikle en uygun çözüm değil


18
Bu, düzeltmek yerine 'Promise' için tür kontrolünü kaldırmaktır, böylece Typecript doğru türü bulur.
edibleEnergy

1
Bu geçici çözüm, örneğin Internet Explorer 11 ile çalışmaz. Promise'ı kullanmaya çalışırken 'tanımsız' bir hata atıyorum. Her neyse, Chrome ile geçici çözüm işini yapıyor.
Calin Vlasin

1
bu korkak bir çıkış yolu. TSBöyle bir şey yapacaksanız neden kullanıyorsunuz ? Yani ne demek istiyorsun ?!
Hafiz Temuri

1
Bunun optimal olmadığını kabul ediyorum, ancak bu bildirimin TS'yi kullanmanın bir anlamı olmadığı anlamına gelmek haksızlık. Bir tipte daktilo kontrolünü bırakmak , diğer daktilo kontrollerini işe yaramaz hale getirmez. Benim için işe yarayan tek çözüm buydu.
Thorkil Værge

Kirli bir saldırı olabilir, ancak bu sayfadaki diğer tüm çözümleri denedikten sonra benim için işe yarayan tek şey bu oldu. En azından kodumu derledim ve çalıştım. İşe yarayan kirli korsanları kazıyorum.
Jeremy Thille

4

Sonunda tsc hatasız çalışmaya başladı. Ancak çoklu değişiklikler. Sayesinde Sandro Keil , sivri & unional

  • Kaldırıldı dt ~ aws-lambda
  • NoEmit, declaration gibi seçenekler kaldırıldı
  • Değiştirilmiş Gruntfile ve yoksayma kaldırıldı

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

Aynı yazı ile dizgi ve sorunu vardı aws-sdk. Çözüm hedefi olarak değiştirmekti es6.

Komple tsconfig.jsondosyam:

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

3
Evet tartgeting es6 düzeltmeli, ancak daha az tarayıcı uyumluluğuna sahipsiniz. Çoğu uygulama hala es5'i hedefliyor, çünkü birçok tarayıcı hala es6'da değil (2017 itibariyle)

@ user2080225 bu doğru olsa da, orijinal soru tarayıcı uyumluluğu hakkında hiçbir şey belirtmediğinden cevabımı daha az doğru yapmıyor. Bu yüzden bu çözüm hala bana yardım eden başkalarına yardımcı olabilir.
Fanus du Toit

3

TypeScript 3.0.1'de aşağıdaki lib dizisini ekleyene kadar aynı sorunu yaşadım

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

Bu, sezgisel olabilir ama bu eklentiyi esnextbenim için çözdüm lib.

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

Derleyici tarafından önerilen DÜZELTME

libDerleyici seçeneğini es2015 veya daha yeni bir sürümle değiştirmeyi deneyin .


1

Core-js, diğer sorunlara neden olduğu için benim için çalışmadı, ancak, npm i @types/es6-promise --save-devsorunlardan kurtulmanın en son sürümünü yüklemek . Benim için sorunları rxjs kullanan bir sdk derleme kaynaklanmıştır. İşte ben hata alıyorum:

`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

Projenizde DefinitelyTyped deposunu kullanıyorsanız, bu son sorunu yaşıyor olabilirsiniz .

Kullanabileceğiniz iyi bir geçici çözüm (tanım dosyasının güncelleştirilmiş bir derlemesini beklemek veya TS kodunuzu yeniden düzenlemek dışında), Visual Studio'nun en son / en sonuncuyu seçmesine izin vermek yerine, core-js yazımları için açık bir sürüm + derleme belirtmektir. . Bu sorundan etkilenmemiş gibi görünen bir tane buldum (en azından benim durumumda), package.jso n dosyanızdan aşağıdaki satırı değiştirerek kullanabilirsiniz :

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

Aşağıdaki ile:

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

Bu benim sorunumu düzeltti. Ancak, sorun çıktığı anda açık sürümü + derleme başvurusunu kaldırmanız önemle tavsiye edilir.

Bu konuyla ilgili daha fazla bilgi için, konu hakkında yazdığım bu blog gönderisini de okuyabilirsiniz .


0

Ben de aynı sorunu vardı ve bu beni ikinci sorundan kurtardı:

konsolda şunu yaz:

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

sorunun kopyalandığı dosyada şunu yapıştırın:

import * as Promise from 'bluebird';

0

Sadece tsconfig.json dosyasındaki hedefi "ES2017" olarak değiştirin.

bu benim tsconfig.json dosyam

{
"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 komutundan sonra, tsconfig.json "hedef" e "es6" den büyük olmalıdır emin olun daha iyi. belki tsc henüz es5'i desteklemiyor.


0

Buradaki en çok oylanan cevapların hiçbiri benim için işe yaramıyor. İşte garantili ve makul bir çözüm. Bunu Promise kullanan herhangi bir kod dosyasının üstüne koyun ...

declare const Promise: any;

3
Hayır, bunu yapma ... ya da böyle bir şey yapacaksan
dizgiyi kullanmayın

0

Bunu düzeltmek için çok zaman harcadım. Burada ya da başka bir yerde herhangi bir çözüm ile şansım yoktu.

Ancak daha sonra bunun sadece sorunu çözmek kadar bir şey olmadığını fark etti. Ama aynı zamanda etkili olması için VSCODE'u TEKRAR BAŞLATMALISINIZ.


0

Aynı hatayla karşılaştım ve bu yapılandırmayla düzelttim:

Dosya: tsconfig.json

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

0

Lütfen tsc komutunu bir dosya adıyla çalıştırıyorsanız, yani:

tsc testfile.ts

tsconfig.json derleyici yapılandırma dosyası yok sayılır. Çözüm, tsc komutunu kendi başına çalıştırmaktır; bu durumda, tsconfig.json dosyasını bir dosya kümesi içerecek şekilde düzenlemediyseniz, dizindeki tüm .ts dosyaları derlenir.

bkz. 'files özelliğini kullanma' ... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html


0

Aynı hata burada. Bunu tsconfig içinde "module": "ES6" kullanarak düzelttim.


0

Aynı hatadan kurtuldum index.tsBu kombine özellikleri ile :

Tsconfig.json içinde:

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

Ve package.json içinde:

  "main": "index.ts",
  "scripts": {
    "start": "tsc -p tsconfig.json && node index.js"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.