typecript: помилка TS2693: 'Обіцяння' стосується лише типу, але тут використовується як значення


144

Я намагаюся використовувати Typescript для своєї AWS Lambda, і я отримую наступні помилки, коли я колись використовую обіцянки.

помилка TS2693: "Обіцянка" стосується лише типу, але тут використовується як значення.

Я спробував використати наступні варіанти коду

Використання конструктора 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"
    ]
}

Я використовую grunt-t із наступною конфігурацією для виконання завдання ts.

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

Я спробував з рішенням, згаданим в одержаному: [ts] "Обіцянка" стосується лише типу, але тут використовується як значення, але не пощастило.


1
Не потрібно значення повернення для функції зворотного виклику, переданої конструктору Promise. Просто позбудься return.
Pointy

Ви маєте на увазі так? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})Я спробував це. Але це не підозрювало проблеми.
kalyanvgopal

Так. JavaScript не має значення, повертаєте ви значення чи ні, але він не звертатиме на нього уваги. Тим не менш, TypeScript піклується.
Pointy

Зрозумів. Але чому 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 . Немає необхідності в DefinitelyTyped.
Сандро Кіль

Це вирішило точну помилку, визначену в питанні для мене, і я просто імпортував 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 також допомагає після встановлення типів
Legends

4
Помилка: працює за допомогою цієї лінії import {Promise} from 'es6-promise';
Лоїк Коен

куди додати "імпорт {Promise} з 'es6-promis'"?
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

Ось моя порада. Тестовано з кодом 1.21.1 (на MAC)

Поставте нижче конфігурацію до tsconfig.json

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

в компіляторOptions

Перезавантажте IDE (ця дія потрібно: D)


3
Це перелічено у кількох відповідях тут, і це важливо напевно: "Перезавантажте IDE (ця дія необхідна)"
atconway

7

У мене була ця помилка, але я вирішив її за допомогою цієї команди, ім'я мого файлу ts - Promes-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 вирішення справи виконує свою роботу.
Калін Власін

1
це трус вихід. Навіщо використовувати те, TSякщо ви збираєтесь робити щось подібне. Я маю на увазі, в чому сенс ?!
Хафіз Темурі

1
Я погоджуюся, що це не є оптимальним, але несправедливо говорити, що ця декларація означає, що немає сенсу використовувати TS. Відміна перевірки на один тип не робить решту контрольних рядків непотрібними. І для мене це було єдине рішення, яке спрацювало.
Thorkil Værge

Це може бути брудний злом, але це єдине, що працювало для мене після того, як я спробував усі інші рішення на цій сторінці. Принаймні, я зібрав і працював свій код. Я копаю брудні хаки, які працюють.
Джеремі Тілль

4

Нарешті tsc почав працювати без помилок. Але багаторазові зміни. Завдяки Сандро Keil , загострені і unional

  • Видалено dt ~ aws-lambda
  • Видалені параметри, такі як noEmit, декларація
  • Змінено 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

Була однакова проблема з машинописом і 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

У мене була така ж проблема, поки я не додав наступний масив 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

Ну, це може бути контрінтуїтивно, але я вирішив це додавання esnextдо свого lib.

{
  "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, можливо, виникла ця остання проблема .

Гідне вирішення, яке ви можете використовувати (крім очікування оновленої збірки файлу визначень або рефакторингу вашого TS-коду), - це вказати явну версію + збірку для типізації core-js, а не дозволяти Visual Studio вибирати останню / останню . Я виявив, що ця проблема, схоже, не зачіпається цією проблемою (в моєму випадку, принаймні), ви можете використовувати її, замінивши наступний рядок із вашого пакета.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

Просто змініть ціль на "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-обережно

після команди up, вам краще перевірити 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-json.html



0

Я позбувся цієї самої помилки index.tsіз цими комбінованими властивостями:

У tsconfig.json:

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

І в package.json:

  "main": "index.ts",
  "scripts": {
    "start": "tsc -p tsconfig.json && node index.js"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.