Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio TypeScript VS-编译错误,但没有设计时错误_Visual Studio_Typescript_Typescript Typings_Tsconfig - Fatal编程技术网

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

Visual studio TypeScript VS-编译错误,但没有设计时错误,visual-studio,typescript,typescript-typings,tsconfig,Visual Studio,Typescript,Typescript Typings,Tsconfig,在Visual Studio 2017中,我尝试使用ES2015承诺。使用TypeScript 2.1.5。我在解决方案中有一个tsconfig.json文件,它如下所示: { "compilerOptions": { "noImplicitAny": false, "noEmitOnError": true, "removeComments": false, "sourceMap": true, "target": "es5", "outFi

在Visual Studio 2017中,我尝试使用ES2015承诺。使用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:类型上不存在生成:属性“then” “保证”

当我转到错误时,intellisense显示它确实识别then函数,我可以右键单击,转到定义,这将带我到lib.es2015.promise.d.ts


为什么设计时有效而编译时无效,我该如何修复?

名为
libs
tsconfig.json
属性-链接到可怕的官方tsconfig文档-只提供键入,例如,您的开发环境可以进入类型定义、推断类型和自动完成代码。它不会将这些类的实现填充到内置JS代码中;在许多情况下,目标环境(例如浏览器)提供了自己的
Promise
实现,因此没有必要这样做。填隙是留给开发人员的责任:(

下面是如何提供
Promise
,它甚至可以编译成ES3

步骤1:安装一个垫片,提供
Promise
在项目根目录中,运行以下命令(假设您有一个
package.json
):

npm安装--保存es6承诺

第2步:使其可用于您的代码 将此行添加到任何使用
承诺的
.ts
文件中:

从“es6承诺”导入{Promise};

步骤3:让您的
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"
  ]
}

如果您真的需要排除
节点\ u模块
(我认为这是一个不常见的用例–您肯定可以绕过这一点……),您可以将
es6 promise
库移动到一个单独的位置,并专门从该位置导入,而不是使用自动模块解析。

非常好的信息,谢谢。要添加一些详细信息-这是一个浏览器应用程序-我有一个psuedo promise shim实现-Q.js。包是通过bower管理的。Typedefs是通过ty管理的pings.All JS全局包含脚本标记:无amd模块。我通过删除lib es2015实现了这一点。承诺,从typings中包含一个typedef-definitelytyped。不知道为什么会这样-两者都是typedef文件。仍然不知道为什么编译器选项-“lib”在VS中只在设计时工作,在编译时无法工作,您可能会认为tsconfig.json编译选项将用于编译。