TypeScript中如何判断变量类型?接口对象与数字类型区分方案
在TypeScript中判断混合类型变量的方法
嘿,这个场景我太熟了!你之前试的那些方法不管用,核心原因是TypeScript的接口在编译成JavaScript后会被完全擦除,没法用instanceof这类依赖运行时构造函数的判断手段。下面给你分情况讲最实用的解决办法:
1. 先判断基础类型(数字)
数字属于JavaScript原生基础类型,直接用typeof就能精准判断,这是最稳妥的第一步:
if (typeof data === 'number') { // 这里TypeScript会自动推断data是number类型,放心写数字相关逻辑 console.log('处理数字:', data.toFixed(2)); return; }
2. 判断接口对象:用自定义类型守卫
因为接口没有运行时存在,我们需要通过检查对象的结构和属性类型来判断,最好的方式是写一个类型谓词函数,让TypeScript能自动推断类型:
假设你的接口是这样的:
interface MyInterface { id: number; content: string; }
写一个类型守卫函数:
// 类型谓词:告诉TypeScript,如果函数返回true,obj就是MyInterface类型 function isMyInterface(obj: unknown): obj is MyInterface { // 先排除null和非对象类型 if (typeof obj !== 'object' || obj === null) { return false; } // 检查必要属性是否存在,且类型符合要求 const candidate = obj as MyInterface; return 'id' in candidate && typeof candidate.id === 'number' && 'content' in candidate && typeof candidate.content === 'string'; }
然后在逻辑里使用:
function handleData(data: MyInterface | number) { if (typeof data === 'number') { console.log('数字类型:', data); } else if (isMyInterface(data)) { // 这里TypeScript已经知道data是MyInterface类型,能自动提示属性 console.log('接口对象:', data.id, data.content); } }
为什么你之前的方法无效?
instanceof C:这个只能判断对象是不是某个类的实例,接口不是构造函数,编译后不存在,所以完全没用。Object.getClass():这是Java里的语法,JavaScript/TypeScript根本没有这个方法,你肯定是记混了😂。.isInstance:一般是类的静态方法(比如某些类库的实现),同样只适用于类实例,不适用于接口定义的对象。
简化版:直接在if里写判断(适合简单接口)
如果你的接口结构很简单,也可以不用单独写函数,直接把判断逻辑写在if里:
if (typeof data === 'object' && data !== null && 'id' in data && typeof (data as MyInterface).id === 'number') { // 这里也能处理,但TypeScript的类型推断不如用类型守卫函数清晰 }
内容的提问来源于stack exchange,提问作者JSON
相关产品推荐
相关产品推荐

