【发布时间】:2021-09-06 21:29:29
【问题描述】:
0。要求
typescript@4.3.4- 编辑器:VSCode 1.15.7
- 操作系统:Ubuntu 20.04
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。问题
- 在TypeScript官方文档中,好像自定义的
*.d.ts可以放在项目的任何子文件夹中? - VSCode 的 IntelliSense 可以正确加载和推断我们的
*.d.ts和扩展的全局Window接口中定义的类型,所以我想我没有写错定义文件……对吧?
我们
window.d.ts中定义的类型将被多个入口文件使用,在这种情况下我不应该将这个window.d.ts复制到多个文件夹中。(注意:这只是一个重现问题的极简项目,所以我只写了一个入口文件
main.ts。在现实世界中,这实际上是一个包含其他入口文件的大型 Electron 项目,例如 @987654351 @ 和electron_entry.js以及 Webpack 捆绑的 SPA 条目...等)
-
tsc --outDir OUT_DIR SRC_FILE是否总是忽略${PWD}/tsconfig.json,除非我使用tsc --project ./tsconfig.json或只使用tsc(将根据tsconfig.json编译所有内容)?我想知道我是否可以直接通过tsc XXXX...在特定的.ts文件上构建** 而无需创建多个tsconfig.json或通过webpack。 -
虽然我发现使用
tsc(不带任何参数)可以成功编译(它会隐式加载tsconfig.json),但我不知道它是如何成功的,也不知道tsconfig.json中的哪个选项使它成功......甚至使用参数--baseUrl . --rootDir . --moduleResolution Node --module commonjs仍然无法加载window.d.ts。 `
【问题讨论】:
标签: typescript tsc