Scala.js导入react-native-fbsdk-next类及静态函数失败,求解决
问题:Scala.js导入React Native第三方库类的静态方法失败
我在第三方库react-native-fbsdk-next的FBAccessToken.ts文件中,有如下包含实例成员和静态方法的类:
class FBAccessToken { accessToken: string; permissions: Array<string>; static getCurrentAccessToken() { return new Promise<FBAccessToken | null>((resolve) => { ... } } } export default FBAccessToken;
我需要同时导入该类的实例成员以及静态方法,于是用Scala类和伴生对象实现,代码如下:
@native @JSImport("react-native-fbsdk-next", "FBAccessToken") class FBAccessToken extends js.Object { def accessToken: String = native def permissions: Array[String] = native } @native @JSImport("react-native-fbsdk-next", "FBAccessToken") object FBAccessToken extends js.Object { def getCurrentAccessToken: Promise[FBAccessToken | Null] = native }
但静态方法导入失败了,sbt fastOptJs编译通过,但在模拟器运行应用时出现如下错误:
TypeError: undefined is not an object (evaluating '_$$_REQUIRE(_dependencyMap[4], "react-native-fbsdk-next").FBAccessToken.getCurrentAccessToken')
请问我哪里操作出错了?
解决方案
问题出在JS模块的导入方式上:原JS模块是默认导出(export default FBAccessToken),而非命名导出,但你在Scala.js中用了命名导入的写法(@JSImport("react-native-fbsdk-next", "FBAccessToken"))。
在JS中,默认导出的内容会挂载在模块的default属性上,而非直接作为模块的顶层属性。你当前的写法相当于尝试访问require("react-native-fbsdk-next").FBAccessToken,但实际正确的访问路径是require("react-native-fbsdk-next").default——这才是包含静态方法的类本身。
正确的导入代码应该修改为:
// 实例类导入,使用JSImport.Default指定默认导出 @native @JSImport("react-native-fbsdk-next", JSImport.Default) class FBAccessToken extends js.Object { def accessToken: String = native def permissions: Array[String] = native } // 伴生对象同样导入默认导出,因为静态方法属于默认导出的类本身 @native @JSImport("react-native-fbsdk-next", JSImport.Default) object FBAccessToken extends js.Object { def getCurrentAccessToken: js.Promise[FBAccessToken | Null] = native }
修改后,Scala.js会生成正确访问默认导出的代码,就能正常调用类的静态方法了。
内容的提问来源于stack exchange,提问作者arinray
相关产品推荐
相关产品推荐

