You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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等结构略)

错误原因

  1. 核心问题:JSON解析结果不是类实例
    JSON.parse()返回的是普通JavaScript对象,而非AjaxBookStringParams类的实例。你通过TypeScript类型标注强制将其赋值给AjaxBookStringParams类型变量,但运行时该对象并不包含类定义的BuildGenieParams方法,因此调用时触发错误。

  2. 次要代码错误

  • 构造函数中this.BookToDelete = JSON.stringify(ajaxParams.AgeCandidates);赋值错误,应该使用ajaxParams.BookToDelete而非AgeCandidates
  • BuildGenieParams方法中ajaxBookGenieParams.ProductFilterParams = JSON.parse(this.BookGenieParams)解析错误,应该解析this.ProductFilterParams而非BookGenieParams
  • AllocatedBooks: 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:37:23