使用Emscripten编译TypeScript绑定时如何注册布尔类型?
兄弟,我太懂你这种想把C++自定义状态类转成TypeScript里顺手好用的布尔值的需求了!之前折腾Emscripten绑定的时候,我也踩过类似的坑,刚好给你分享下实际可行的办法。
首先得明确咱们的核心目标:让C++里的status_t实例,在TS里能直接当成布尔值用——成功状态对应true,错误状态对应false对吧?下面分几步来弄:
第一步:在C++绑定里注册布尔转换逻辑
你得用Emscripten的EMSCRIPTEN_BINDINGS宏,给status_t类绑定布尔转换的入口。如果你的status_t已经有了布尔转换运算符(比如operator bool()),直接绑定这个运算符就行;要是类里是用isSuccess()这类方法判断状态,绑定这个方法也可以。举个实际的代码例子,假设你的C++
status_t是这样的:class status_t { private: bool success_flag; public: status_t(bool success) : success_flag(success) {} // 布尔转换运算符 operator bool() const { return success_flag; } // 或者判断成功的方法 bool isSuccess() const { return success_flag; } };那绑定代码就这么写:
#include <emscripten/bind.h> using namespace emscripten; EMSCRIPTEN_BINDINGS(status_type_binding) { class_<status_t>("Status") // 绑定布尔转换运算符,让Emscripten自动转成JS/TS的boolean .function("operator bool", &status_t::operator bool) // 要是用isSuccess方法的话,就换成这个 // .function("isSuccess", &status_t::isSuccess) ; }第二步:补全TypeScript的类型定义
如果编译时加了--emit-tsd参数,Emscripten会自动生成.d.ts文件,但有时候自动生成的类型可能不够贴合咱们的需求,这时候可以手动扩展下:declare class Status { operator bool(): boolean; // 用isSuccess的话就写这个 // isSuccess(): boolean; }要是想在TS里直接用
if (status)这种自然的写法,不用每次都调用方法,还可以给Status类加个Symbol.toPrimitive方法,让JS/TS自动把它转成布尔值:// 先扩展类型定义 declare class Status { operator bool(): boolean; [Symbol.toPrimitive](hint: string): boolean | string; } // 在JS模块里实现这个转换逻辑 Status.prototype[Symbol.toPrimitive] = function(hint) { if (hint === 'boolean' || hint === 'default') { return this.operator bool(); } return this.toString(); };这样之后,你在TS里就能像用普通布尔值一样用它:
const opStatus = new Status(true); if (opStatus) { console.log("操作成功啦!"); } else { console.log("操作出问题了..."); }第三步:编译时的关键参数
编译的时候一定要加--bind参数开启绑定支持,要是想自动生成TS类型定义,记得加上--emit-tsd,比如这个编译命令:em++ your_source.cpp --bind --emit-tsd -o your_module.js这里提个踩过的坑:如果你的C布尔转换运算符是
explicit修饰的(C11及以后的写法),Emscripten没法自动识别,必须手动绑定这个运算符,不然TS里拿不到正确的布尔值哦!
内容来源于stack exchange

