为导出单一函数的无类型模块定义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}`); }
为什么之前的写法有问题?
- 原写法的接口未导出:你之前的
Change、Chunk、File是模块内部的接口,没有加export,所以外部无法导入。 - 默认导出的坑:如果改成默认导出,
import * as parse会得到一个包含default属性的模块对象,而不是函数本身,所以调用parse()时会提示“没有调用签名”——因为你调用的是模块对象,不是函数。
这样调整后,既保留了parse-diff作为单一函数的调用体验,又能自由复用它的内部类型啦!
内容的提问来源于stack exchange,提问作者squgeim
相关产品推荐
相关产品推荐

