node-ffi-napi输出参数与@types/ffi-napi类型不匹配问题咨询
解决方案
问题根源
你遇到的类型报错本质是@types/ffi-napi的默认类型定义,将动态加载的C库函数参数限制为基础值类型,但你传入的是ref-napi分配的Value<number>指针实例,二者类型不匹配。以下是几种比as any更安全的替代方案:
方案1:显式声明库接口(最推荐)
提前为你加载的C库定义完整的TS接口,创建库实例时直接做类型断言,既能解决参数类型不匹配问题,还能获得完整的类型提示和校验能力。
修改后的代码如下:
import { alloc, types, Value } from 'ref-napi'; import { Library } from 'ffi-napi'; // 新增:定义C库的接口类型 interface LibMy { test1: () => number; test2: (a: Value<number>) => number; } // 创建库实例时指定为上面定义的接口类型 const lib = Library('libmy', { test1: ['int', []], test2: ['int', ['int*']] }) as LibMy; const res1 = lib.test1(); console.log(`test1() returned ${res1}`); const res2: Value<number> = alloc(types.int); // 无需any断言,直接传参即可通过校验 lib.test2(res2); console.log(`test2() returned ${res2.deref()}`);
方案2:单独收窄单个函数的类型
如果不想定义完整的库接口,也可以在调用函数时单独对函数做类型断言,仅针对单次调用做类型修正:
// 仅修改调用行即可 (lib.test2 as (a: Value<number>) => number)(res2);
方案3:全局扩展ffi-napi的类型定义
如果项目中大量用到ref-napi指针作为ffi函数参数,可以直接扩展@types/ffi-napi的全局类型定义,一劳永逸解决所有同类问题:
在项目的类型声明文件(比如global.d.ts)中添加如下内容:
import type { Value, Pointer } from 'ref-napi'; declare module 'ffi-napi' { // 扩展ffi函数的参数类型,支持接收ref指针实例 type FFIFunc = (...args: (string | number | boolean | Pointer | Value<unknown>)[]) => unknown; export type DynamicLibrary = Record<string, FFIFunc>; }
添加后所有ffi加载的库函数都默认支持接收ref-napi的指针实例,无需额外做类型断言。
内容的提问来源于stack exchange,提问作者Pascal
相关产品推荐
相关产品推荐

