Typescript类AjaxBookStringParams方法BuildGenieParams调用报错求助
问题:调用
AjaxBookStringParams类的BuildGenieParams方法时报错 调用AjaxBookStringParams类的BuildGenieParams方法时,出现以下错误:
BookGenieLoader.ts:47 Uncaught TypeError: ajaxString.BuildGenieParams is not a function
这是该类唯一的方法,推测是低级错误导致无法运行。
相关代码
AjaxBookStringParams类代码
export class AjaxBookStringParams { AgeCandidates: string = ""; // AllocationCandidates by age to-from server BookToDelete: string = ""; // Used to delete an allocated book AllocatedBooks: string = "";;; // placeholder for to-from server - grid display BookGenieParams: string = ""; Data: string = ""; ProductFilterParams: string = ""; Request: string = ""; constructor(ajaxParams:AjaxBookGenieParams){ this.AgeCandidates = JSON.stringify(ajaxParams.AgeCandidates); this.BookToDelete = JSON.stringify(ajaxParams.AgeCandidates); this.AllocatedBooks = JSON.stringify(ajaxParams.AllocatedBooks); this.BookGenieParams = JSON.stringify(ajaxParams.BookGenieParams); this.ProductFilterParams = JSON.stringify(ajaxParams.ProductFilterParams); this.Data = ajaxParams.Data; this.Request = ajaxParams.Request; } BuildGenieParams():AjaxBookGenieParams{ const ajaxBookGenieParams:AjaxBookGenieParams = new AjaxBookGenieParams(); if(this.AgeCandidates != ""){ajaxBookGenieParams.AgeCandidates = JSON.parse(this.AgeCandidates)} if(this.BookToDelete != ""){ajaxBookGenieParams.BookToDelete = JSON.parse(this.BookToDelete)} if(this.AllocatedBooks != ""){ajaxBookGenieParams.AllocatedBooks = JSON.parse(this.AllocatedBooks)} if(this.BookGenieParams != ""){ajaxBookGenieParams.BookGenieParams = JSON.parse(this.BookGenieParams)} if(this.ProductFilterParams != ""){ajaxBookGenieParams.ProductFilterParams = JSON.parse(this.BookGenieParams)} ajaxBookGenieParams.Data = this.Data; ajaxBookGenieParams.Request = this.Request; return ajaxBookGenieParams; } getJsonString():string{ const jsonString = JSON.stringify({ajaxBookStringParams: AjaxBookStringParams,}) ; return jsonString; }}
调用代码
$(function () { // this is param load from initial page load - only used once let element = document.getElementById("AjaxBookGenieParamsHold"); let htmlElement: HTMLElement = element as HTMLElement; let tParam: string = htmlElement.innerHTML; let ajaxString:AjaxBookStringParams = JSON.parse (tParam); let ajaxBookGenieParams:AjaxBookGenieParams = ajaxString.BuildGenieParams(); BookGenieMethods.ajaxBookGenieParams = ajaxBookGenieParams; // initial load of values });
相关引用类(部分核心结构)
export class AjaxBookGenieParams { AgeCandidates: AgeCandidate[] = []; BookToDelete: Book = new Book(); AllocatedBooks: AllocatedBook[] = []; BookGenieParams: BookGenieParams = new BookGenieParams(); Data: string = ""; ProductFilterParams: ProductFilterParams = new ProductFilterParams(); Request: string = "";} // 其他关联类(如Book、AgeCandidate等结构略)
错误原因
核心问题:JSON解析结果不是类实例
JSON.parse()返回的是普通JavaScript对象,而非AjaxBookStringParams类的实例。你通过TypeScript类型标注强制将其赋值给AjaxBookStringParams类型变量,但运行时该对象并不包含类定义的BuildGenieParams方法,因此调用时触发错误。次要代码错误
- 构造函数中
this.BookToDelete = JSON.stringify(ajaxParams.AgeCandidates);赋值错误,应该使用ajaxParams.BookToDelete而非AgeCandidates BuildGenieParams方法中ajaxBookGenieParams.ProductFilterParams = JSON.parse(this.BookGenieParams)解析错误,应该解析this.ProductFilterParams而非BookGenieParamsAllocatedBooks: string = "";;;存在多余分号
修复方案
1. 修正实例化逻辑
将JSON解析后的普通对象传入AjaxBookStringParams构造函数,创建真正的类实例:
$(function () { // 页面初始加载参数,仅使用一次 let element = document.getElementById("AjaxBookGenieParamsHold"); let htmlElement: HTMLElement = element as HTMLElement; let tParam: string = htmlElement.innerHTML; // 先解析为普通对象,再通过构造函数生成类实例 let parsedParams = JSON.parse(tParam); let ajaxString:AjaxBookStringParams = new AjaxBookStringParams(parsedParams); let ajaxBookGenieParams:AjaxBookGenieParams = ajaxString.BuildGenieParams(); BookGenieMethods.ajaxBookGenieParams = ajaxBookGenieParams; // 初始化参数 });
2. 修正代码中的低级错误
- 修正构造函数赋值:
constructor(ajaxParams:AjaxBookGenieParams){ this.AgeCandidates = JSON.stringify(ajaxParams.AgeCandidates); this.BookToDelete = JSON.stringify(ajaxParams.BookToDelete); // 改为BookToDelete this.AllocatedBooks = JSON.stringify(ajaxParams.AllocatedBooks); this.BookGenieParams = JSON.stringify(ajaxParams.BookGenieParams); this.ProductFilterParams = JSON.stringify(ajaxParams.ProductFilterParams); this.Data = ajaxParams.Data; this.Request = ajaxParams.Request; }
- 修正
BuildGenieParams方法解析逻辑:
BuildGenieParams():AjaxBookGenieParams{ const ajaxBookGenieParams:AjaxBookGenieParams = new AjaxBookGenieParams(); if(this.AgeCandidates != ""){ajaxBookGenieParams.AgeCandidates = JSON.parse(this.AgeCandidates)} if(this.BookToDelete != ""){ajaxBookGenieParams.BookToDelete = JSON.parse(this.BookToDelete)} if(this.AllocatedBooks != ""){ajaxBookGenieParams.AllocatedBooks = JSON.parse(this.AllocatedBooks)} if(this.BookGenieParams != ""){ajaxBookGenieParams.BookGenieParams = JSON.parse(this.BookGenieParams)} if(this.ProductFilterParams != ""){ajaxBookGenieParams.ProductFilterParams = JSON.parse(this.ProductFilterParams)} // 改为ProductFilterParams ajaxBookGenieParams.Data = this.Data; ajaxBookGenieParams.Request = this.Request; return ajaxBookGenieParams; }
- 修正多余分号:
AllocatedBooks: string = "";
3. 可选优化:添加静态fromJSON方法
为了简化实例化流程,可以在AjaxBookStringParams类中添加静态方法:
export class AjaxBookStringParams { // ... 现有属性和方法 ... static fromJSON(jsonStr: string): AjaxBookStringParams { const parsed = JSON.parse(jsonStr); return new AjaxBookStringParams(parsed); } }
调用时可简化为:
let ajaxString = AjaxBookStringParams.fromJSON(tParam);
内容的提问来源于stack exchange,提问作者BedfordNYGuy
相关产品推荐
相关产品推荐

