为生成的Javascript声明允许从库公开的类型的正确方法是什么?看起来应该很简单,但是要使用和获得手写的.d.ts
文件复制到outDir
是非常困难的。目前,我得到的outDir
中tsc
生成的.d.ts
文件,所以它有推断类型,而不是正确的。
源结构:
src/
__generated__/
validateEvent.js <-- generated
validateEvent.d.ts <-- NOT generated, but doesn't seem to work elsewhere
Event.ts
index.ts
validateEvent.d.ts
:
import { ValidateFunction } from "ajv";
import { Event } from "../Event.js";
export const validate: ValidateFunction<Event>;
export default validate;
index.ts
:
export * from "./Event.js";
export { default as validateEvent } from "./__generated__/validateEvent.js";
tsconfig.json
:
{
"compilerOptions": {
"allowJs": true,
"composite": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"lib": ["es2021"],
"module": "es2022",
"moduleResolution": "node",
"outDir": "./dist",
"rootDir": "./src",
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"target": "es2022",
},
"include": ["src/**/*"]
}
这里似乎有两个相关的问题:
- 我怎么能得到我的
.d.ts
文件复制到outDir
,而不是从生成的Javascript生成的一个? - 我可以把我的
.d.ts
文件在__generated__
目录以外的地方?(如果我能解决这个问题,也许第一条就没有意义了。我尝试过各种形式的declare module
,但除了将.d.ts
放在生成的源旁边之外,没有任何工作。)
如果它很重要,我使用ES模块和tsc --build
与项目参考。作为临时黑客,我手动将.d.ts
文件复制到outDir
,但这对tsc --build --watch
和nodemon
不起作用。
到目前为止,我最好的答案是导入带有生成类型的生成的Javascript,然后导出一个强制转换的版本:
index.ts
:
export * from "./Event.js";
import { ValidateFunction } from "ajv";
import { Event } from "./Event.js";
import { default as validateEvent0 } from "./__generated__/validateEvent.js";
export const validateEvent =
validateEvent0 as ValidateFunction<Event>;