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

如何实现泛型instanceof函数:匹配类型返回对象否则返回false?

TypeScript泛型类型判断函数的错误解决办法

错误原因

你猜的没错,TypeScript的类型仅存在于编译阶段,编译为JavaScript后所有类型信息都会被擦除。instanceof是运行时的判断操作,需要传入一个运行时存在的构造函数,而T只是编译时的类型标识,无法在运行时作为值使用,这就是报错的核心原因。

解决方案

要实现需求,必须额外传入目标类型对应的构造函数(构造函数是运行时存在的实体),调整后的实现如下:

版本1:返回实例或false

function isInstance<T>(s: unknown, ctor: new (...args: any[]) => T): T | false {
  return s instanceof ctor ? s : false;
}

版本2:使用类型谓词(更利于类型推断)

如果希望TypeScript能在后续代码中自动推断类型,推荐使用类型谓词版本:

function isInstance<T>(s: unknown, ctor: new (...args: any[]) => T): s is T {
  return s instanceof ctor;
}

使用示例

以判断Date实例为例:

// 版本1用法
const testVal1 = new Date();
const result1 = isInstance(testVal1, Date);
// result1 类型为 Date | false,运行时若为Date实例则返回原对象,否则返回false

// 版本2用法
const testVal2 = Math.random() > 0.5 ? new Date() : "not a date";
if (isInstance(testVal2, Date)) {
  // 此处testVal2会被TypeScript自动推断为Date类型
  console.log(testVal2.getFullYear());
}

代码说明

  • new (...args: any[]) => T是构造函数类型,它表示一个可以通过new关键字创建出T类型实例的函数。
  • 传入构造函数后,运行时就能通过instanceof完成实例判断,同时编译阶段TypeScript也能基于T提供类型检查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:01:31