如何让TypeScript识别Node子进程中process.send永不为undefined?
Node.js多进程TypeScript中process.send类型问题的优雅解决方法
在使用TypeScript编写Node.js多进程应用时,主进程通过child.fork()启动子进程后,子进程文件中调用process.send()会触发编译错误:Error: Cannot invoke an object which is possibly 'undefined'。虽然类型断言可以解决,但写法繁琐,以下是几种更优雅的解决方案:
问题代码示例
主进程main.ts:
// main.ts import * as child from 'child_process'; child.fork('my_fork.js', [], {});
子进程my_fork.ts:
// my_fork.ts process.send({command: 42}); // 编译报错 (<Required<typeof process>>process).send({command: 42}); // 可行但写法丑陋
优雅解决方案
非空断言操作符
使用!明确告知TypeScriptprocess.send一定存在,写法简洁直观:process.send!({command: 42});类型守卫(类型缩小)
通过简单的条件判断让TypeScript自动推断类型,消除编译报错:if (process.send) { process.send({command: 42}); }若需要更严谨的类型约束,可自定义类型守卫函数:
function isForkedProcess(p: NodeJS.Process): p is NodeJS.Process & Required<Pick<NodeJS.Process, 'send'>> { return typeof p.send === 'function'; } if (isForkedProcess(process)) { process.send({command: 42}); }扩展全局类型声明
在项目中创建一个类型声明文件(如child-process-env.d.ts),扩展NodeJS.Process类型,强制send为必填属性:declare namespace NodeJS { interface Process { send: (message: any, callback?: (error: Error | null) => void) => boolean; } }注意:仅当该文件只会作为fork的子进程运行时使用此方法,避免在主进程或其他非fork场景中引入类型错误。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

