машинопись, ошибка 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.