std::string的Turbo模块方法,该参数将被自动转换;同样,返回std::string的Turbo模块方法将向JavaScript环境返回JavaScript字符串。其中一些类型(例如std::string和int32_t)是基本的C++类型。其他类型是Vega特有的,大多存在于com::amazon::kepler::turbomodule命名空间中。
类型映射
下表显示了TypeScript类型与其C++对应类型之间的映射。这是codegen工具使用的映射。 其中一些类型不是基本TypeScript的一部分,需要从@amazon-devices/keplerscript-turbomodule-api导入。
[1]
int64_t可能因Number.MAX_SAFE_INTEGER发生精度损失。对于有精度要求的大整数,您可以使用BigInt。
[2] 同构数组是指其元素类型相同的数组。
[3] 对于有符号和无符号的64位整数,都支持将BigInt用作直接方法参数和返回类型。有关支持的用法的更多详细信息,请参阅BigInt。
[4] JSObject的差距得到解决后,JsonContainer将被删除。如果需要使用该类型,可以从泛型Object的@amazon-devices/keplerscript-turbomodule-api中导入JsonContainer类型,也可定义自定义类型别名,例如:
Number.MAX_SAFE_INTEGER的整数,使用std::string表示形式来表示Turbo模块的参数和返回类型。您可以在JavaScript和C++实现中将字符串转换为更合适的类型。
JSArray
对于同构 (T[]) 数组,您可以使用。对于其他数组,可以使用JSArray。
JSArray是一个std::vector,它接受各种元素类型,包括空指针、布尔值、各种int、double、float、std::string、JSArray和JSObject。因此,它的用法类似于std::vector。
示例
JSObject
JSObject是一个带有std::string键的std::map,它接受各种值类型,包括空指针、布尔值、各种int、double、float、std::string、JSArray和JSObject。因此,它的用法类似于std::map。
JSObject提供了一种静态parseJson方法。parseJson方法接受std::string JSON字符串并返回等效的JSObject。
示例
代理JSObject和JSArray
除了JSObject和JSArray类型外,Vega Turbo模块还支持代理类型proxy::JSObject和proxy::JSArray。代理类型的关键功能之一是动态访问和修改。您可以直接使用C++代码对JavaScript对象和数组进行读取和写入,而不必创建副本。
但是,在使用这些代理类型时,请谨记以下的重要事项:
- 线程注意事项: 代理类型必须在JSThread上下文和Turbo模块方法调用的范围内使用。这些类型不能从任意线程存储或访问。线程安全检查仅在调试模式下执行。因此,在多线程环境中使用这些代理对象时需要小心。
-
原生结构:
虽然您可以在本地构造新的代理项目,但您需要利用Turbo模块或HostCallback方法获取所需的JSRuntime作为方法参数。
警告:请勿使用默认的构造函数。这些代理类型的默认构造函数仅用于支持
std::tuple和std::variant等结构中的当前内部用法。您不应该依赖这些默认的构造函数,因为它们需要JSThread上下文,并且在未来的版本中将会被删除。
JSRuntime
JSRuntime类型表示JavaScript运行时环境。它是一种仅限原生的类型,任何Turbo模块或HostCallback方法都可以将其作为参数进行调用。它通常用于在C++中创建新的代理项目。
注意: JSRuntime无法从非JSRuntime进行构造。
proxy::JSObject
借助proxy::JSObject类型,您不仅可以创建可以传递到原生代码的JavaScript对象,还可以从本机端动态访问和修改其属性和方法,而无需创建副本。
注意: 对proxy::JSObject的访问仅限于JSThread上下文,并且必须在Turbo模块方法调用的范围内进行。线程安全检查仅在调试模式下执行。
proxy::JSArray
借助proxy::JSArray类型,您可以创建支持传递到原生代码的JavaScript数组,并从本机端动态访问和修改其元素。
注意: 对proxy::JSArray的访问仅限于JSThread上下文,并且必须在Turbo模块方法调用的范围内进行。线程安全检查仅在调试模式下执行。
Promise
应该在单独的线程上执行Promise。Promise是使用PromiseOperation作为输入来构造的。PromiseOperation是接受并返回void的函数。
Promise有resolve和reject方法。可以使用Error或std::string来拒绝Promise,并使用类型映射中的任何C++ Turbo模块类型来解析。
示例
Callback
应该在单独的线程上执行回调。Callback对象只能是参数值,代表传递给C++的JavaScript回调。有关作为返回类型的Callback的信息,请参见HostCallback。
Callback对象公开的唯一方法是invoke,它使用指定的参数调用JavaScript回调,并将结果返回给C++。
示例
HostCallback
HostCallback只能是一个返回值,用于向JavaScript环境返回C++回调。有关参数类型的回调,请参见Callback。
示例
ArrayBuffer
ArrayBuffer表示通用、固定长度的原始二进制数据缓冲区。
示例
BigInt
一个BigInt代表一个整数。在JavaScript中,BigInt用于表示超过Number.MAX_SAFE_INTEGER或Number.MIN_SAFE_INTEGER的整数。在Vega中,Turbo模块支持通过基于int64_t和uint64_t的getter和constructor方法表示BigInt。
BigInt,但只能作为原始值,不能作为JSArray或JSObject的一部分。
如果JavaScript BigInt过大而无法用Vega Turbo模块BigInt类型表示(例如无法用int64_t或uint64_t表示),则会触发断言失败,Vega Turbo模块的所有无效参数也是如此。有关更多信息,请参阅“高级Turbo模块主题”中的错误处理。
utils::json::JsonContainer
将不再把JsonContainer用于JSObject类型,但目前仍存在一些功能缺口。有关支持类型的完整列表,请参阅类型映射。
示例
NativeObject
在大多数情况下,当您将数据从原生代码传递给JavaScript时,一个JSONContainer或JSObject便足以满足需求。但是,如果您需要一个可以从JavaScript调用其方法的原生对象,您需要创建一个实现com::amazon::kepler::turbomodule::NativeObject的对象。
示例

