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

如何获取TypeScript类中变量的数据类型?遇typeof返回异常问题

解决TypeScript中类属性的类型判断问题

嘿,我来帮你拆解这两个遇到的类型判断小坑~

第一个问题:为什么typeof this.model.size返回"undefined"?

你定义的第一个Model类只是声明了size: number类型,但没有给它初始化值。在TypeScript编译成JavaScript后,未初始化的类属性不会被添加到实例中,所以当你new Model()后,this.model.size实际上是undefined,而typeof undefined的结果就是字符串"undefined"(不是字面量undefined,你可以仔细看看控制台输出的是带引号的字符串哦)。

要解决这个问题,你需要确保属性被初始化:

  • 给属性设置默认值:
export class Model {
  name: string = '';
  size: number = 0; // 给number类型默认值
}
  • 或者通过构造函数初始化:
export class Model {
  name: string;
  size: number;
  constructor(name: string, size: number) {
    this.name = name;
    this.size = size;
  }
}
// 实例化时必须传入参数
this.model = new Model('示例名称', 100);

这样this.model.size就会是有效的number类型,typeof结果就是"number"了。

第二个问题:为什么传入null后,typeof this.model.size返回"object"?

这是JavaScript的历史遗留问题——typeof null的结果就是"object",哪怕null本身并不是对象。你在实例化时传了null给size,虽然TypeScript里size被标记为number | undefined(因为size?: number),但null在JS里的类型判断就是这个特殊情况。

如果要准确区分null和number,可以这样做:

  1. 先判断是否为null,再判断类型:
if (this.model.size === null) {
  console.log('size的值是null');
} else if (typeof this.model.size === 'number') {
  console.log('size是有效的number类型');
}
  1. 用更精准的自定义类型判断函数(比如你提到的toType方法):
function toType(value: unknown): string {
  return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
}

// 调用示例
console.log(toType(this.model.size)); // 当是null时返回"null",是number时返回"number"

这个方法能准确区分null、数组、普通对象等typeof无法区分的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:04:17