NativeScript插件iOS Protocol调用报错:BLASessionDelegateImpl未定义
解决NativeScript插件中BLASessionDelegateImpl未定义的错误
问题根源
你遇到的Uncaught ReferenceError: BLASessionDelegateImpl is not defined错误,本质是**BLASessionDelegateImpl仅在类型声明文件(.d.ts)中做了声明,没有在实际代码文件(.ts)中实现这个类**。NativeScript的@NativeClass()装饰器需要作用在真实的类实现上,而不是仅存在于类型定义里的declare class。
修复方案
1. 重构声明文件(bla.ios.d.ts)
把BLASessionDelegateImpl的实现逻辑移除,只保留类型声明:
declare interface BLASessionDelegate extends NSObjectProtocol { sessionInitialized?(); } declare class BLASessionDelegateImpl extends NSObject implements SessionDelegate { static ObjCProtocols: [typeof BLASessionDelegate]; static new(): BLASessionDelegateImpl; sessionDelegate: SessionDelegate; sessionInitialized(): void; }
2. 在bla.ios.ts中实现BLASessionDelegateImpl
将类的实际代码移到这里,并正确使用@NativeClass()装饰器:
import { NativeClass } from "@nativescript/core"; import { SessionDelegate } from "./index"; // 声明原生协议的全局类型 declare const BLASessionDelegate: typeof NSObjectProtocol; @NativeClass() export class BLASessionDelegateImpl extends NSObject implements SessionDelegate { static ObjCProtocols = [BLASessionDelegate]; static new(): BLASessionDelegateImpl { return <BLASessionDelegateImpl>super.new(); } sessionDelegate: SessionDelegate; public sessionInitialized() { console.log("Adi - inside sessionInitialized"); if (this.sessionDelegate.sessionInitialized) { this.sessionDelegate.sessionInitialized(); } } } export const setSessionDelegate = function(sessionDelegate: SessionDelegate) { if (typeof(bla) !== "undefined") { console.log("Adi - in the setSessionDelegate"); const delegate = BLASessionDelegateImpl.new(); delegate.sessionDelegate = sessionDelegate; bla.setSessionDelegate(delegate); } }
3. 确保类型可访问(可选)
如果需要在插件外部引用BLASessionDelegateImpl的类型,在index.d.ts中导出:
export interface SessionDelegate { sessionInitialized?(); // 其他方法 } // 导出Delegate实现类的类型 export type { BLASessionDelegateImpl } from "./bla.ios";
核心注意事项
@NativeClass()必须绑定真实类:.d.ts文件中的declare class只是类型描述,不会生成可执行的JavaScript类,NativeScript无法识别这种“空”声明。- 类型与实现分离:始终保持
.d.ts负责类型定义,.ts负责业务逻辑实现,避免混淆。 - 导入必要依赖:确保
bla.ios.ts中正确导入NativeClass和SessionDelegate,避免后续出现其他类型错误。
内容的提问来源于stack exchange,提问作者Adi Vizgan
相关产品推荐
相关产品推荐

