as

Settings
Sign out
Notifications
Alexa
亚马逊应用商店
Ring
AWS
文档
Support
Contact Us
My Cases
新手入门
设计和开发
应用发布
参考
支持
跳转到主要内容
Vega Turbo模块支持各种原生类型,这些类型可以在Turbo模块参数和返回值中与JavaScript相互转换。这意味着,例如,可以使用JavaScript字符串从JavaScript调用接受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类型,也可定义自定义类型别名,例如:
注意:​ 对于大于JavaScript的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。 示例
您也可以使用HostCallback来调用Callback。

ArrayBuffer

ArrayBuffer表示通用、固定长度的原始二进制数据缓冲区。 示例

BigInt

一个BigInt代表一个整数。在JavaScript中,BigInt用于表示超过Number.MAX_SAFE_INTEGER或Number.MIN_SAFE_INTEGER的整数。在Vega中,Turbo模块支持通过基于int64_t和uint64_t的getter和constructor方法表示BigInt。
您可以在方法参数和返回类型以及回调和Promise中使用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的对象。 示例
请注意,仅支持将NativeObject作为Turbo模块方法返回类型,而不支持将其作为参数。

APMF类型

IDL使用某些APMF类型,这些类型并不总是可以在支持的Turbo模块参数/返回类型之间直接转换。您可能需要实现自定义逻辑才能进行这些转换。

相关主题

创建Turbo模块
最后修改于 2026年10月26日