【问题标题】:How do I compile a single file in Typescript?如何在 Typescript 中编译单个文件?
【发布时间】:2019-05-18 02:46:11
【问题描述】:

因此,我正在尝试创建我的 Angular Web 应用的 Electron 版本,以在具有原生外观和感觉的桌面上运行。

我在 package.json 中有以下脚本

{
  "name": "app",
  "version": "1.0.0",
  "main": "main.js",
  "license": "MIT",
  "productName":"example",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "build-prod": "ng build --prod",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "electron-tsc": "tsc main.ts && ng build --base-href ./ && electron .",
  },

main.ts 文件基本上就是这里给出的例子。 https://electronjs.org/docs/tutorial/first-app

问题是,当我运行命令 'npm run electron-tsc' 时,打字稿正在扫描我的目录的子文件夹并尝试编译我的整个 Angular 应用程序,但也有很多错误。

像这样。

node_modules/@types/selenium-webdriver/http.d.ts:24:14 - 错误 TS2583: 找不到名称“地图”。您需要更改目标库吗?尝试 将 lib 编译器选项更改为 es2015 或更高版本。

24 个标题:地图; ~~~

node_modules/@types/selenium-webdriver/http.d.ts:48:14 - 错误 TS2583: 找不到名称“地图”。您需要更改目标库吗?尝试 将 lib 编译器选项更改为 es2015 或更高版本。

48 个标题:地图; ~~~

node_modules/@types/selenium-webdriver/remote.d.ts:139:29 - 错误 TS2583:找不到名称“地图”。你需要改变你的目标吗 图书馆?尝试将 lib 编译器选项更改为 es2015 或更高版本。

139 setEnvironment(env: Map | {[name: string]: 字符串} |空):这个;

我的 main.ts 没有导入,命令指定只编译 main.ts

碰巧我仍然生成了一个有效的 main.js 文件,之后我可以手动运行 ng build --base-href ./ && electron . 并且一切正常,只是令人沮丧的是我无法使用一个命令构建和运行它,并且我不明白这些错误。

这是我的 tsconfig.json

{
  "compileOnSave": false,
  "compilerOptions": {
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2017",
      "dom"
    ]
  }

}

【问题讨论】:

  • 这可能是由于automatic type inclusion。尝试文档所说的禁用它:将"types": [] 添加到您的tsconfig.json
  • 感谢您的回复,刚刚试过但同样的错误:/
  • 那么我猜这些类型由于参考而被包括在内。我不确定为什么会出现这些编译错误,但您应该能够使用 --skipLibCheck 选项来抑制它们。这将跳过 *.d.ts 文件中的类型检查。
  • --skipLibCheck 对我的 tsc 命令有效! :) 随意添加作为答案。我将稍等片刻,看看是否有更好的答案来解释问题的实际原因。如果没有我会接受。谢谢!!
  • 奇怪的是错误引用了缺少Map,但你的库设置为es2017,它肯定应该有Map的类型......你的tsconfig.json可能没有得到已接?如果你在main.ts 中使用Map,它会编译吗?

标签: angular typescript electron


【解决方案1】:

使用--skipLibCheck 将抑制错误,而不是修复它们。短期内没问题(只是为了让你在处理根本原因时继续前进),但由于它完全退出库类型检查,所以它真的是一把枪。

要让 TypeScript 扫描声明文件并将其包含在编译中,它必须是您明确依赖的东西(您的项目中的 importrequire)或隐含的(添加到 types 它的你的tsconfig.json)。很多时候,它并不完全是你的依赖,而是你的依赖的依赖。为了真正的类型安全,树中的所有内容都必须有序。有时只是因为提供的类型不完善,需要修复。

您可以从更新@types/selenium-webdriver 开始,然后更新您的依赖项。尝试运行 npx npm-check --update 以查看需要更新的内容。

如果这没有帮助,您可以为相关库编写类型声明(然后将它们发送到 DefinedTyped 或将它们保留在您的项目中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 2013-03-29
    • 1970-01-01
    • 2016-12-05
    • 2012-12-26
    • 2017-02-13
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多