typescript : 오류 TS2693 : 'Promise'는 유형 만 참조하지만 여기서 값으로 사용 중입니다.


144

AWS Lambda에 Typescript를 사용하려고하는데 약속을 사용할 때마다 다음과 같은 오류가 발생합니다.

오류 TS2693 : 'Promise'는 유형 만 참조하지만 여기서 값으로 사용 중입니다.

코드에서 다음 변형을 사용해 보았습니다.

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

ts 작업을 실행하기 위해 다음 구성으로 grunt-ts를 사용하고 있습니다.

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

I는 언급 된 수용액으로 시도 I 얻을 [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가 필요하지 않습니다.
산드로 Keil

그것은 나를 위해 질문에 정의 된 정확한 오류를 해결했으며 Promis를 사용하지 않고 rxjs를 가져 왔습니다. 정말 고마워!
muzurB

3
이것은 아마도 es5를 대상으로 한 사람들에게 가장 좋은 대답 일 것입니다. es5에서 es2015로 전환하면이 문제도 해결되었습니다. 그러나 IDE / 편집기를 종료했다가 다시 시작할 때까지 오류가 계속 나타날 수 있습니다. TSC (또는 시계 모드)에 관한 것이 실제로 실제로 수정되지 않았지만 vscode를 다시 시작 해야하는 것으로 나타났습니다.

7
업데이트 / 부록 : 컴파일러 옵션에서 "lib": [ "es2015", "dom", " ScriptHost "], 나를위한 요령은 VSCode 편집기를 다시 시작해야 변경을 한 후에 작동하기 시작한다는 것을 깨달았습니다.

83

오늘 같은 오류가 발생하여 다음과 같이 해결했습니다.

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

최신 정보:

더하다:

import {Promise} from 'es6-promise'

3
+ 유형을 설치 한 후 VS 코드를 다시 시작하면 도움이됩니다.
Legends

4
정오표 :이 줄을 사용하여 작동합니다 import {Promise} from 'es6-promise'.
Loic Coenen

"es6-promise '에서"import {Promise} "를 추가 할 위치는?
bArraxas

과거 에이 솔루션을 사용했지만 현재로서는 효과가 없습니다. import { Promise } from '../node_modules/es6-promise/es6-promise';그러나 잘 작동하는 것 같습니다. TS가 설치된 타이핑을 찾을 수없는 이유는 무엇입니까?
snarf '

35

tsconfig.json 파일에 아래 코드를 추가 하여이 문제를 해결했습니다.

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

3
이것은 나를 위해 일했지만 "lib"배열은 tsconfig.json 파일의 "compilerOptions"객체 안에 있어야합니다.
BillyRayCyrus 2016 년

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;

추신 : 이것은 확실히 최적의 솔루션이 아닙니다


18
이것은 'Promise'에 대한 유형 검사를 수정하지 않고 제거하므로 Typescript가 올바른 유형을 찾습니다.
edibleEnergy

1
이 해결 방법은 예를 들어 Internet Explorer 11에서는 작동하지 않습니다. Promise를 사용하려고 할 때 '정의되지 않은'오류가 발생합니다. 어쨌든 Chrome을 사용하면 해결 방법이 그의 역할을 수행합니다.
Calin Vlasin 2016 년

1
그것은 비겁한 방법입니다. TS이런 식으로 할 경우 왜 사용 합니까? 그럼 요점이 뭐야?!
Hafiz Temuri

1
이것이 최적이 아니라는 데 동의하지만이 선언이 TS 사용에 아무런 의미가 없다고 말하는 것은 부당합니다. 유형에서 유형 검사를 삭제 해도 나머지 유형 검사는 쓸모가 없습니다. 그리고 나에게 이것은 이것이 유일한 해결책이었습니다.
Thorkil Værge

더러운 해킹 일지 모르지만이 페이지의 다른 모든 솔루션을 시도한 후에 나에게 도움이 된 유일한 방법입니다. 적어도 나는 코드를 컴파일하고 작동시켰다. 나는 더러운 해킹을 파 낸다.
제레미 틸

4

마지막으로 tsc는 오류없이 작동하기 시작했습니다. 그러나 여러 변경 사항이 있습니다. 덕분에 산드로 카일 , 뾰족한 & unional

  • dt ~ aws-lambda 제거
  • noEmit, 선언과 같은 옵션 제거
  • 그런트 파일 수정 및 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

typescript 및와 같은 문제가 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이 수정해야하지만 브라우저 호환성이 떨어집니다. 많은 브라우저가 아직 es6를 아직 사용하지 않아 (2017 년 기준)

@ user2080225 사실이지만 원래 질문에 브라우저 호환성에 대한 내용이 없으므로 내 대답이 덜 정확하지 않습니다. 따라서이 솔루션은 여전히 ​​도움이되는 다른 사람들을 도울 수 있습니다.
Fanus du Toit

3

typeScript 3.0.1에서 다음 lib 배열을 추가 할 때까지 동일한 문제가 발생했습니다.

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",
  }
}

컴파일러가 제안한 FIX는

lib컴파일러 옵션을 es2015 이상으로 변경하십시오 .


1

Core-js는 다른 문제를 일으켰으므로 나에게 효과가 없었지만 최신 버전을 설치 npm i @types/es6-promise --save-dev하면 문제가 해결되었습니다. 나를 위해 문제는 rxjs를 사용하는 SDK를 컴파일하여 비롯되었습니다. 내가 얻은 오류는 다음과 같습니다.

`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 코드를 리팩터링하는 것을 제외하고 사용할 수있는 적절한 해결 방법은 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

tsconfig.json 파일에서 대상을 "ES2017"로 변경하십시오.

이것은 내 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-promise

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 명령을 단독으로 실행하는 것입니다.이 경우 파일 세트를 포함하도록 tsconfig.json을 편집하지 않은 경우 디렉토리의 모든 .ts 파일이 컴파일됩니다.

'파일 속성 사용'을 참조하십시오 ... https://www.typescriptlang.org/docs/handbook/tsconfig-json.html


0

여기에도 같은 오류가 있습니다. tsconfig에서 "module": "ES6"을 사용하여이 문제를 해결했습니다.


0

index.ts이 결합 된 속성 으로이 동일한 오류를 제거했습니다 .

tsconfig.json에서 :

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

그리고 package.json에서 :

  "main": "index.ts",
  "scripts": {
    "start": "tsc -p tsconfig.json && node index.js"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.