如何为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
相关产品推荐
相关产品推荐

