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

Posted

技术标签:

【中文标题】TypeScript VS - 编译错误但没有设计时错误【英文标题】:TypeScript VS - compile errors but no design time errors 【发布时间】:2017-08-12 01:42:34 【问题描述】:

在 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:Property 'then' 在类型上不存在 '承诺'。

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

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

【问题讨论】:

【参考方案1】:

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

这里是提供Promise 的方法,它甚至可以编译成 ES3...

第 1 步:安装提供 Promise 的垫片

在您的项目根目录中,运行以下命令(假设您有一个package.json):

npm install --save es6-promise

第 2 步:使其可用于您的代码

将此行添加到任何使用Promise.ts 文件中:

import Promise from '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://***.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(我认为这是一个不常见的用例 - 您肯定可以解决这个问题..?),您可以将 es6-promise 库移动到单独的位置并专门从该位置,而不是使用自动模块解析。

【讨论】:

很棒的信息,谢谢。添加一些细节 - 这是一个浏览器应用程序 - 我确实有一个伪承诺 shim 实现 - Q.js。包由凉亭管理。 Typedefs 是通过类型来管理的。所有 JS 都包含在全局脚本标签中:没有 amd 模块。我能够通过删除 lib es2015.promise 来实现此功能,包括来自类型化的 typedef - 绝对类型。不知道为什么会这样 - 两者都是 typedef 文件。仍然不知道为什么 compilerOptions - "lib" 仅适用于 VS 中的设计时而无法在编译时起作用,您会认为 tsconfig.json 编译选项将用于编译。

以上是关于TypeScript VS - 编译错误但没有设计时错误的主要内容,如果未能解决你的问题,请参考以下文章

VS Code Typescript 在 Vuejs 项目中给出错误“属性不存在”

如何设置我的VS 2013 TypeScript项目来编译我的打字稿文件但排除我的node_modules?

C#程序在VS编译器加载时出现找不到方法,无法显示该程序窗体设计器

无法在 Visual Studio 2012 中编译 TypeScript 文件

Typescript 在使用 create react app 进行编译时不会出错

WebPack 中的 Typescript (at-loader) 编译器错误