如何为youtube-dl-exec的TypeScript声明中函数属性指定返回类型?
修复youtube-dl-exec的TypeScript声明:正确指定exec方法的返回类型
要解决这个问题,你需要通过交叉类型定义默认导出的类型——既要满足函数调用的签名,又要包含exec属性的类型定义。以下是完整的声明文件写法:
// youtube-dl-exec.d.ts declare module 'youtube-dl-exec' { // 定义YtResponse结构,根据实际返回值补充字段 export interface YtResponse { id: string; title: string; duration: number; // 其他返回字段... } // 定义youtube-dl的配置选项,按需补充 export interface YoutubeDlOptions { url: string; output?: string; quality?: string; // 其他配置选项... } // 导入execa的进程类型(需确保已安装@types/execa) import { ExecaChildProcess } from 'execa'; // 交叉类型:函数类型 + exec方法属性 type YoutubeDlExec = ((options: YoutubeDlOptions) => Promise<YtResponse>) & { exec(options: YoutubeDlOptions): ExecaChildProcess; }; const youtubeDlExec: YoutubeDlExec; export default youtubeDlExec; }
关键说明:
- 交叉类型的作用:通过
FunctionType & { exec: MethodType }的形式,让TypeScript既识别默认导出是可直接调用的函数,又能识别它附带的exec属性。 - 类型依赖处理:确保已安装
@types/execa包,这样ExecaChildProcess类型才能被正确识别。如果不想依赖第三方类型,可以自行声明ExecaChildProcess的基础结构:// 自行声明ExecaChildProcess核心结构 interface ExecaChildProcess { stdin: NodeJS.WritableStream; stdout: NodeJS.ReadableStream; stderr: NodeJS.ReadableStream; kill(signal?: string): void; // 其他需要的方法/属性... } - 解决返回any的问题:之前返回
any通常是因为类型定义不完整(比如未正确导入ExecaChildProcess、交叉类型写法错误),或者没有明确指定方法的返回类型。上述写法通过显式绑定ExecaChildProcess,能让TypeScript正确推断返回类型。
使用示例:
import youtubeDl from 'youtube-dl-exec'; // 直接调用,返回Promise<YtResponse> const response = await youtubeDl({ url: 'https://youtube.com/watch?v=xxx' }); // 调用exec方法,返回ExecaChildProcess const process = youtubeDl.exec({ url: 'https://youtube.com/watch?v=xxx' }); process.stdout.on('data', (data) => { // 处理进度输出 console.log(data.toString()); });
内容的提问来源于stack exchange,提问作者p10ben
相关产品推荐
相关产品推荐

