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.