TypeScript VS - 编译错误但没有设计时错误

时间:2017-03-20 16:47:53

标签: visual-studio typescript typescript-typings tsconfig

在Visual Studio 2017中,我尝试使用ES2015 Promises。使用TypeScript 2.1.5。我在解决方案中有一个tsconfig.json文件,它看起来像这样:

{
  "compilerOptions": {
    "noImplicitAny": false,
    "noEmitOnError": true,
    "removeComments": false,
    "sourceMap": true,
    "target": "es5",
    "outFile": "outfile.js",
    "lib": [ "dom",  "es2015.promise", "es5" ]
  },
  "exclude": [
    "node_modules",
    "wwwroot"
  ]
}

我编译,我得到打字错误,例如:

  

错误TS2339:Build:属性'then'在类型上不存在   '承诺'。

当我转到错误时,我有智能感知显示它实际上识别了then函数,我可以右键单击,转到定义,它将我带到lib.es2015.promise.d.ts。

为什么设计时间不起作用,编译时间不起作用,我该如何解决?

1 个答案:

答案 0 :(得分:0)

名为tsconfig.json的{​​{1}}属性 - 链接到可怕的官方tsconfig文档here - 只提供输入,例如,您的开发环境可以转到类型定义,推断类型和自动完成代码。它不会将这些类的实现简化为内置的JS代码;在许多情况下,目标环境(例如浏览器)提供了自己的libs实现,因此没有必要。 Shimming是开发人员的责任:(

以下是如何提供Promise,甚至可以编译为ES3 ...

步骤1:安装提供Promise

的垫片

在项目根目录中,运行此命令(假设您有Promise):

package.json

第2步:将其提供给您的代码

将此行添加到使用npm install --save es6-promise的任何.ts文件中:

Promise

步骤3:让import {Promise} from 'es6-promise';编译器知道输入

我将在此处编辑您当前的tsc文件:

tsconfig.json

如果你确实需要排除{ "compilerOptions": { // I've moved "noImplicitAny" to below. "noEmitOnError": true, "removeComments": false, "sourceMap": true, "target": "es3", // We can target ES3 with this method, if we want! "outFile": "outfile.js", /* From http://stackoverflow.com/a/32410515/5951226 : part of this block adds support for ES6 Promises */ "noImplicitAny": false, "declaration": false, "module": "commonjs", "noLib": false }, "exclude": [ // "node_modules", // We'll need to include "node_modules/es6-promise", so I'll leave it to you to play around with your inclusions/exclusions which are unique to your own use case. "wwwroot" ] } (我认为这是一个不常见的用例 - 当然你可以绕过这个......?),你可以将node_modules库移到一个单独的位置并专门从该位置导入,而不是使用自动模块解析。