Visual studio TypeScript VS-编译错误,但没有设计时错误
在Visual Studio 2017中,我尝试使用ES2015承诺。使用TypeScript 2.1.5。我在解决方案中有一个tsconfig.json文件,它如下所示: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
{
"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编译选项将用于编译。