如何获取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,可以这样做:
- 先判断是否为
null,再判断类型:
if (this.model.size === null) { console.log('size的值是null'); } else if (typeof this.model.size === 'number') { console.log('size是有效的number类型'); }
- 用更精准的自定义类型判断函数(比如你提到的
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
相关产品推荐
相关产品推荐

