在TypeScript中将字符串转换为数字:如何处理JSON API响应?

3

我正在使用Axios进行API调用,并返回JSON。API返回CUSIP作为字符串类型,然而,我希望将其作为数字类型接收。我创建了一个接口,其中typescript类型为number,但是当我获取变量时,它仍然被视为字符串。

API调用和一些逻辑:

const axios = require('axios');
import { General } from './json-objects-new';

module.exports = {
    makeApiCall : function(ticker:string) {

    axios.get(`${API_ENDPOINT}${ticker}?api_token=${API_KEY}`)
        .then(function (response) {
            // handle success    
            return response.data;

        })
        .catch(function (error) {
            // handle error
            console.log(error);
        })
        .then(data => {

            let gen : General = data.General;

            let num = gen.CUSIP + 1337

            console.log(num);

        });

    }
}

我创建了一个名为General的接口,在其中将CUSIP转换为数字:

export interface General {
    ISIN: string;
    CUSIP: number;
}

问题:输出应该是 [CUSIP + 1337] = [2 + 1337 = 1339],但实际输出的是[21337]。希望得到一些帮助,谢谢。我真的不想在构造函数中手动转换所有内容。

让num等于Number(gen.CUSIP) + 1337。 - Ruan Mendes
1
不确定"I really don't want to have to cast everything manually in a constructor."的意思。你没有构造函数...此外,在TypeScript中进行强制转换永远不会改变变量,它只是告诉编译器你知道自己在做什么,但在这种情况下,你并不知道,因为底层对象仍然是一个字符串:p - Ruan Mendes
2个回答

1
尝试将字符串类型的 CUSIP 改为数字类型:
const axios = require("axios");
import { General } from "./json-objects-new";

module.exports = {
  makeApiCall: function(ticker: string) {
    axios
      .get(`${API_ENDPOINT}${ticker}?api_token=${API_KEY}`)
      .then(function(response) {
        // handle success
        return response.data;
      })
      .catch(function(error) {
        // handle error
        console.log(error);
      })
      .then(data => {
        let gen: General = data.General;

        let num = Number(gen.CUSIP) + 1337; /* convert CUSIP string to number */

        console.log(num);
      });
  }
};


然而,这并没有解决根本问题。接口期望gen.CUSIP是“number”类型的。问题在于Axios反序列化一个字符串并将其放入数字属性中。我也遇到了相同的问题。这破坏了类型安全性。我的期望是Axios有一个选项来严格反序列化类型,如果JSON和接口成员类型之间存在字符串<->数字不匹配,则返回错误。 - Mick Belker - Pseudonym

0

你必须记住,Typescript 只是在 Javascript 上面的一层类型,它不会修改实际的 Javascript。

在你的情况下,即使 CUSIP 被定义为数字类型,你收到的实际数据是一个字符串。你应该将从 API 获取的数据声明为字符串,然后使用 parseInt(gen.CUSIP, 10) 将其转换为数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接