【问题标题】:`tsc` cannot find self-defined declaration files (.d.ts)`tsc` 找不到自定义声明文件 (.d.ts)
【发布时间】:2021-09-06 21:29:29
【问题描述】:

0。要求

  • typescript@4.3.4
  • 编辑器:VSCode 1.15.7
  • 操作系统:Ubuntu 20.04

➡➡➡Minimalist reproduce repo in here

1。项目结构

我创建了一个简约的 TypeScript 项目,其结构如下所示:

.  // Project root directory ($PWD)
├── dist
│   └── main.js  // output file
├── Makefile
├── package.json
├── package-lock.json
├── src
│   ├── main.ts
│   └── types
│       └── window.d.ts  // ←extends some properties to `global.Window` 
└── tsconfig.json

2。自定义界面global.Window

我扩展了一些附加在内置 Window 全局接口上的自定义属性:

// window.d.ts
export { }  // to solve TS2669, see https://stackoverflow.com/questions/57132428/augmentations-for-the-global-scope-can-only-be-directly-nested-in-external-modul

declare global {
  interface OurDefinedGlobalRuntimeEnv {
    /** Runtime value (Defined in preload.js)
    *   - `web`: Ordinary web browser.
    *   - `electron`: Electron renderer window.
    */
    BROWSER: 'electron' | 'web' | undefined
    SERVER_IP: string
    DEBUG: string
    NODE_ENV: node_env_t,
  }
  type node_env_t = 'production' | 'development'
  interface Window {
    __RUNTIME_ENV__: OurDefinedGlobalRuntimeEnv
  }
}

然后将我们自定义的对象注入window

// main.ts
type inferPropType<T, K extends keyof T> = T[K]
const rtenv1: inferPropType<Window, '__RUNTIME_ENV__'> = {
  BROWSER: 'electron',
  NODE_ENV: process.env.NODE_ENV === 'development' ? 'development' : 'production',
  SERVER_IP: process.env.SERVER_IP || '',
  DEBUG: process.env.DEBUG || '',
  ENV_VAR: process.env,
}
const rtenv2: OurDefinedGlobalRuntimeEnv = rtenv1
window.__RUNTIME_ENV__ = rtenv1

3。 VSCode 智能感知 & tsc

到目前为止,VSCode 的 IntelliSense 没有输出任何错误或警告,并且可以通过 IntelliSense 正确推断类型:

并运行tsc,项目的根路径为$CWD

cd PROJECT_ROOT_DIR
npx tsc --outDir ./dist/ --module commonjs ./src/*.ts

但是,这会爆炸:

4。问题出在哪里?

调试> 7小时后,我发现tsc无法检测到*.d.ts*.d.ts不在同一文件夹中。也就是说,如果移动window.d.ts

.
└── src
    ├── main.ts
    └── types
        └── window.d.ts

变成这样:

.
└── src
    ├── main.ts
    └── window.d.ts

现在tsc编译通过了:

npx tsc --outDir ./dist/ --module commonjs ./src/*.ts

5。问题

  1. 在TypeScript官方文档中,好像自定义的*.d.ts可以放在项目的任何子文件夹中?
  2. VSCode 的 IntelliSense 可以正确加载和推断我们的*.d.ts 和扩展的全局Window 接口中定义的类型,所以我想我没有写错定义文件……对吧?

我们window.d.ts中定义的类型将被多个入口文件使用,在这种情况下我不应该将这个window.d.ts复制到多个文件夹中。

(注意:这只是一个重现问题的极简项目,所以我只写了一个入口文件main.ts。在现实世界中,这实际上是一个包含其他入口文件的大型 Electron 项目,例如 @987654351 @ 和 electron_entry.js 以及 Webpack 捆绑的 SPA 条目...等)

  1. tsc --outDir OUT_DIR SRC_FILE 是否总是忽略${PWD}/tsconfig.json,除非我使用tsc --project ./tsconfig.json 或只使用tsc(将根据tsconfig.json 编译所有内容)?我想知道我是否可以直接通过tsc XXXX... 在特定的.ts 文件上构建** 而无需创建多个tsconfig.json 或通过webpack

  2. 虽然我发现使用tsc(不带任何参数)可以成功编译(它会隐式加载tsconfig.json),但我不知道它是如何成功的,也不知道tsconfig.json中的哪个选项使它成功......甚至使用参数--baseUrl . --rootDir . --moduleResolution Node --module commonjs 仍然无法加载window.d.ts。 `

【问题讨论】:

    标签: typescript tsc


    【解决方案1】:

    您正在运行的命令:npx tsc --outDir ./dist/ --module commonjs ./src/*.ts 错误。在这里,您要求 TypeScript *仅编译 src/*.ts 下的文件。

    修复

    使用 tsconfig 编译,即npx tsc -p ./tsconfig.json。甚至npx tsc 因为它会默认获取 tsconfig.json ?

    PS 我测试了你的项目,很好

    【讨论】:

    • 对不起,我在我原来的问题中提到过这种方式,但这不是我想要的(因为我在现实世界中有 3 个入口文件......很难解释,我完全无法理解这种行为tsc....)。最后,我终于放弃了,写了一个webpack.config.js 包含多个条目来构建我的项目,现在问题似乎解决了......
    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 2016-12-15
    • 2017-06-28
    • 1970-01-01
    • 2021-04-23
    • 2018-03-20
    • 2018-03-05
    • 2018-03-04
    相关资源
    最近更新 更多