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

TypeScript中如何检查参数是否属于自定义类型?

在TypeScript中检查自定义类型的方法

首先得明确一个关键事实:TypeScript的类型系统完全是编译时的,所有自定义类型信息在代码编译为JavaScript后都会被彻底擦除。这就是为什么你用typeof par只能得到"object"——运行时根本不知道myType这个类型存在。

要检查一个值是否符合你定义的自定义类型,我们需要通过运行时检查对象的结构,再配合TypeScript的「类型守卫」(Type Guard)让编译器也能识别这个检查结果。下面是具体的实现方式:

1. 自定义类型守卫函数(最常用)

针对你的myType,我们可以写一个专门的检查函数,返回「类型谓词」(obj is myType),这样TypeScript会在后续代码中自动推断类型。

type myType = { n: number };

// 类型守卫函数:判断传入值是否符合myType
function isMyType(obj: unknown): obj is myType {
  // 第一步:排除非对象和null的情况(typeof null会返回"object",需要单独处理)
  if (typeof obj !== 'object' || obj === null) {
    return false;
  }
  // 第二步:检查对象是否包含n属性,且n是number类型
  return 'n' in obj && typeof (obj as Record<string, unknown>).n === 'number';
}

// 使用示例
const par = { n: 3 };
const x = { name: 'test' };

if (isMyType(par)) {
  // 这里TypeScript会自动推断par是myType类型,可以安全访问par.n
  console.log(par.n.toFixed(2)); // 输出 "3.00"
}

if (isMyType(x)) {
  // 这个分支永远不会执行,TypeScript也会知道x不符合myType
  console.log(x.n);
}

如果你的自定义类型包含更多属性(比如可选属性、嵌套对象),只需要扩展检查逻辑即可。比如针对type myType = { n: number; m?: string },可以修改守卫函数:

function isMyType(obj: unknown): obj is myType {
  if (typeof obj !== 'object' || obj === null) {
    return false;
  }
  const candidate = obj as Record<string, unknown>;
  // 必选属性n必须存在且是number,可选属性m如果存在则必须是string
  return 'n' in candidate && typeof candidate.n === 'number' && 
         ('m' in candidate ? typeof candidate.m === 'string' : true);
}

2. 用类替代类型别名(适合需要实例化的场景)

如果你的类型对应具体的实例对象,可以用class来定义,这样就能直接用instanceof做运行时检查——因为类在编译后会保留构造函数信息。

class MyType {
  constructor(public n: number) {}
}

const par = new MyType(3);
console.log(par instanceof MyType); // 输出 true

// 这里TypeScript也会自动推断par是MyType类型
console.log(par.n);

注意:类和类型别名/接口的用途不同,类型别名可以描述任意形状的对象(比如字面量对象),而类只能描述它的实例。

总结

  • TypeScript的自定义类型在运行时不存在,所以不能直接用typeof/instanceof检查
  • 最通用的方案是自定义类型守卫函数,通过检查对象的结构来模拟类型验证,同时让编译器能识别验证结果
  • 如果是类实例,可以直接用instanceof

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:32:39