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

如何在对对象进行类型转换时同时解析对象内的字符串?

问题描述

我定义了如下自定义Model:

class Person {
    age: number;
    personality: Personality;
}

class Personality {
    shy: boolean;
    moody: boolean;
}

调用API获取结果时,收到的响应结构为:

{
    "age": 20,
    "personality": "{\"shy\": \"true\",\"moody\":\"false\"}"
}

我目前通过以下代码将响应赋值给变量:

response.body().personality = JSON.parse(response.body().personality)
const person = response.body() as Person

其中personality是需要直接解析的字符串,请问如何避免编写response.body().personality = JSON.parse(response.body().personality)这句代码?

解决方案

推荐这几种方式来避免手动写那行解析代码:

1. 封装转换函数

写个专门的函数把API响应转成Person类型,之后直接调用就行:

function toPerson(responseBody: any): Person {
    return {
        ...responseBody,
        personality: JSON.parse(responseBody.personality) as Personality
    };
}

// 使用示例
const person = toPerson(response.body());

2. 给Person类加构造函数处理解析

修改Person的构造函数,实例化时自动搞定personality的解析:

class Person {
    age: number;
    personality: Personality;

    constructor(rawData: { age: number; personality: string }) {
        this.age = rawData.age;
        this.personality = JSON.parse(rawData.personality) as Personality;
    }
}

// 使用示例
const person = new Person(response.body());

3. 加类型守卫做严谨校验

如果需要确保解析后的personality符合类型,可以加个类型守卫函数:

function isPersonality(obj: any): obj is Personality {
    return typeof obj.shy === 'boolean' && typeof obj.moody === 'boolean';
}

function parsePerson(rawData: any): Person {
    const parsedPersonality = JSON.parse(rawData.personality);
    if (!isPersonality(parsedPersonality)) {
        throw new Error('Personality格式不符合要求');
    }
    return {
        age: rawData.age,
        personality: parsedPersonality
    };
}

// 使用示例
const person = parsePerson(response.body());

4. 用HTTP客户端拦截器自动处理

如果项目用了Axios这类工具,可以加响应拦截器,全局自动解析指定字段:

import axios from 'axios';

// 添加响应拦截器
axios.interceptors.response.use(res => {
    if (res.data?.personality) {
        res.data.personality = JSON.parse(res.data.personality);
    }
    return res;
});

// 之后请求API时直接拿类型化的数据
const { data: person } = await axios.get<Person>('/api/person');

内容的提问来源于stack exchange,提问作者Chinmay Atrawalkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:41:10