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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:13:25