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

为导出单一函数的无类型模块定义TypeScript类型并导出内部接口

解决parse-diff类型声明:既保留函数调用又能导入内部接口

我明白你的痛点——既要保持parse-diff作为单一函数的调用方式,又想复用它的内部类型接口。咱们来调整一下类型声明的写法,完美解决这个问题:

正确的类型声明写法

首先,把你定义的Change、Chunk、File接口导出,同时保留export = parse的结构,这样既不破坏原函数的调用方式,又能让外部访问这些类型:

declare module 'parse-diff' {
  // 导出所有需要复用的接口
  export interface Change {
    type: string;
    normal: boolean;
    ln1: number;
    ln2: number;
    content: string;
  }

  export interface Chunk {
    content: string;
    changes: Change[];
    oldStart: number;
    oldLines: number;
    newStart: number;
    newLines: number;
  }

  export interface File {
    chunks: Chunk[];
    deletions: number;
    additions: number;
    from: string;
    to: string;
    index: string[];
  }

  // 定义parse函数的类型
  function parse(diff: string): File[];

  // 保持命名空间合并,确保export = 正常工作
  namespace parse {}

  export = parse;
}

如何使用

在你的业务代码里,用两种不同的导入方式分别处理函数和类型(需要TypeScript 3.8及以上版本支持import type):

// 导入parse函数(保持你原来的调用习惯)
import * as parse from 'parse-diff';
// 导入需要的类型(用import type避免把类型编译到JS里)
import type { File, Change, Chunk } from 'parse-diff';

// 正常调用函数
const diffText = `你的diff内容`;
const result: File[] = parse(diffText);

// 复用类型定义
function logFileChanges(file: File) {
  console.log(`文件: ${file.from} -> ${file.to}`);
  console.log(`新增行数: ${file.additions}, 删除行数: ${file.deletions}`);
}

为什么之前的写法有问题?

  1. 原写法的接口未导出:你之前的Change、Chunk、File是模块内部的接口,没有加export,所以外部无法导入。
  2. 默认导出的坑:如果改成默认导出,import * as parse会得到一个包含default属性的模块对象,而不是函数本身,所以调用parse()时会提示“没有调用签名”——因为你调用的是模块对象,不是函数。

这样调整后,既保留了parse-diff作为单一函数的调用体验,又能自由复用它的内部类型啦!

内容的提问来源于stack exchange,提问作者squgeim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:44:18