You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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;
}

关键说明:

  1. 交叉类型的作用:通过FunctionType & { exec: MethodType }的形式,让TypeScript既识别默认导出是可直接调用的函数,又能识别它附带的exec属性。
  2. 类型依赖处理:确保已安装@types/execa包,这样ExecaChildProcess类型才能被正确识别。如果不想依赖第三方类型,可以自行声明ExecaChildProcess的基础结构:
    // 自行声明ExecaChildProcess核心结构
    interface ExecaChildProcess {
       stdin: NodeJS.WritableStream;
       stdout: NodeJS.ReadableStream;
       stderr: NodeJS.ReadableStream;
       kill(signal?: string): void;
       // 其他需要的方法/属性...
    }
    
  3. 解决返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:05:25