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

如何为scratch-parser中module.exports的匿名函数断言TS类型?

为Scratch Parser的匿名导出函数添加TypeScript类型断言

我需要给scratch-parser项目里这段通过module.exports导出的匿名函数加类型定义:

module.exports = function (input, isSprite, callback) {
    // Unpack the input and further transform the json portion by parsing and
    // validating it.
    unpack(input, isSprite)
        .then(function (unpackedProject) {
            return parse(unpackedProject[0])
                .then(validate.bind(null, isSprite))
                .then(function (validatedProject) {
                    return [validatedProject, unpackedProject[1]];
                });
        })
        .then(callback.bind(null, null), callback);
};

已经提前定义好对应的函数类型:

declare function scratchParser(
  input: Buffer | string,
  isSprite: boolean,
  callback: (
    err: Error,
    project: ScratchParser.Project | ScratchParser.Sprite,
  ) => void,
): void;

但因为这是匿名函数,没法直接给函数本身断言类型,怎么通过module.exports来搞定?


解决方式

1. 直接给导出的匿名函数做类型断言

在导出时用as关键字把匿名函数断言为已定义的scratchParser类型:

module.exports = function (input, isSprite, callback) {
    // 原函数逻辑保持不变
} as typeof scratchParser;

2. 先给变量指定类型再导出

把匿名函数赋值给一个带类型标注的变量,再导出这个变量,可读性更强:

const parser: typeof scratchParser = function (input, isSprite, callback) {
    // 原函数逻辑保持不变
};

module.exports = parser;

3. 用声明文件定义模块导出类型

如果是给整个scratch-parser库写类型声明,可以在.d.ts文件里直接声明模块的导出类型:

declare module 'scratch-parser' {
  export namespace ScratchParser {
    type Project = { /* 补充Project的具体结构定义 */ };
    type Sprite = { /* 补充Sprite的具体结构定义 */ };
  }

  export default function (
    input: Buffer | string,
    isSprite: boolean,
    callback: (err: Error, project: ScratchParser.Project | ScratchParser.Sprite) => void
  ): void;
}

这样在导入该模块时,TypeScript就能自动识别导出函数的类型了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:45:23