машинопись, ошибка 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}"`));

Версии

Ниже приведены версии в моих зависимостях 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] «Обещание» относится только к типу, но используется здесь как значение, но не повезло.


1
Возвращаемое значение не требуется для функции обратного вызова, переданной в конструктор Promise. Просто избавься от return.
Заостренный

Вы имеете в виду, как это? responsePromise = new Promise((resolve, reject) => { reject(new Error("missing is needed data"))})Я попробовал это. Но это не помогло с проблемой.
kalyanvgopal

Да. JavaScript не волнует, возвращаете ли вы значение или нет, но он не будет обращать на это внимание. TypeScript, однако, заботится.
Заостренный

Понял. Но почему 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
Спасибо Сандро. Пробовал то же самое, но не помогло в моем случае.
kalyanvgopal

Может быть @types/aws-lambda, устарели. Amazon поставляет типы Typescript с официальным SDK . Нет необходимости определенно набирать.
Сандро Кейл

Это решило точную ошибку, определенную в вопросе для меня, и я просто импортировал rxjs, даже не используя Promis. Спасибо!
muzurB

3
Вероятно, это лучший ответ для тех, кто нацелился на es5 с самого начала. Переключение с es5 на es2015 также исправило это и для меня. Однако имейте в виду, что вы, вероятно, по-прежнему будете видеть ошибку, пока не завершите работу и не перезапустите IDE / редактор. Что-то в TSC (или в его режиме просмотра) заставляло казаться, что это не исправляло, когда это действительно было, но требовало перезапуска vscode.

7
update / addendum: если вы хотите настроить таргетинг на 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';
Лоик Коенен

где добавить "import {Promise} из 'es6-обещания'"?
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 - promises-fs.ts:

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

и ошибка ушла


5

Добавьте строку ниже в файл, где выдается ошибка. Это должно решить проблему

declare var Promise: any;

PS: это определенно не оптимальное решение


18
Это просто убирает проверку типа для Promise, а не исправляет ее, поэтому Typescript находит правильный тип.
edibleEnergy

1
Этот обходной путь не работает, например, с Internet Explorer 11. Я выбрасываю неопределенную ошибку при попытке использовать Promise. В любом случае с Chrome обходной путь делает свое дело.
Калин Власин

1
это трусливый выход. Зачем использовать, TSесли вы собираетесь сделать что-то вроде этого. Я имею в виду какой смысл тогда ?!
Хафиз Темури

1
Я согласен, что это не оптимально, но нечестно сказать, что это заявление означает, что нет смысла использовать TS. Отбрасывание проверки типов на один тип не делает остальные проверки типов бесполезными. И для меня это было единственным решением, которое сработало.
Торкил Вурге

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

4

Наконец TSC начал работать без каких-либо ошибок. Но несколько изменений. Благодаря Сандро Кейлу , Pointy & 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
Да, 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

Ну, это может быть нелогичным, но я решил это добавить 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

Если вы используете репозиторий DefiniteTyped в своем проекте, вы можете столкнуться с этой недавней проблемой .

Достойный обходной путь, который вы можете использовать (кроме ожидания обновленной сборки файла определений или рефакторинга кода TS), - это указать явную версию + сборку для типизаций 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"
  }

Это исправило мою проблему навсегда. Тем не менее, настоятельно рекомендуется удалить явную версию + ссылку на сборку, как только проблема будет выпущена.

Для получения дополнительной информации по этой проблеме, вы также можете прочитать этот пост в блоге, который я написал по этой теме.


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 я --save-dev @ types / es6-обещание

после команды up лучше проверить tsconfig.json и убедиться, что «target» должен быть больше, чем «es6». возможно tsc пока не поддерживает es5.


0

Ни один из полученных здесь ответов не работает для меня. Здесь гарантированное и разумное решение. Поместите это в верхней части любого файла кода, который использует Promise ...

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.