如何为生成的Javascript声明Typescript类型



为生成的Javascript声明允许从库公开的类型的正确方法是什么?看起来应该很简单,但是要使用获得手写的.d.ts文件复制到outDir是非常困难的。目前,我得到的outDirtsc生成的.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/**/*"]
}

这里似乎有两个相关的问题:

  1. 我怎么能得到我的.d.ts文件复制到outDir,而不是从生成的Javascript生成的一个?
  2. 我可以把我的.d.ts文件在__generated__目录以外的地方?(如果我能解决这个问题,也许第一条就没有意义了。我尝试过各种形式的declare module,但除了将.d.ts放在生成的源旁边之外,没有任何工作。)

如果它很重要,我使用ES模块和tsc --build与项目参考。作为临时黑客,我手动将.d.ts文件复制到outDir,但这对tsc --build --watchnodemon不起作用。

到目前为止,我最好的答案是导入带有生成类型的生成的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>;

最新更新