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

如何检查TypeScript类型是否合并了指定内部类型?

实现TypeScript泛型HasInnerB检测类型是否存在内部命名空间类型B

首先要修正一个前提:命名空间中的内部类型必须使用export导出,否则外部无法访问到该类型,这是检测的基础。

针对你的需求,由于TypeScript的类型系统中类型与命名空间是相互独立的——你定义的type A是对象类型,而同名的namespace A是另一个独立的命名空间实体,二者的合并仅允许你通过A标识符访问命名空间成员,但类型A本身并不包含命名空间里的类型信息,因此无法直接通过泛型类型自动检测同名命名空间中是否存在B类型。

不过可以通过两种方式实现类似需求:

方案一:手动标记法

给包含内部B类型的类型添加一个标记属性,通过检测该属性判断是否符合条件:

type A = {
  field: number
} & { __hasInnerB?: true }; // 添加标记

namespace A {
  export type B = {
    field: string
  }
}

type C = {
   field: boolean
}

type HasInnerB<T> = T extends { __hasInnerB?: true } ? true : false;

type AHasInnerB = HasInnerB<A>; // true
type CHasInnerB = HasInnerB<C>; // false

方案二:将类型改为Class(同时作为类型和值)

如果可以调整类型定义方式,将type改为class,此时A既是类型也是值,就能通过typeof获取命名空间的类型并检测成员:

class A {
  field: number;
}

namespace A {
  export type B = {
    field: string
  }
}

type C = {
   field: boolean
}

type HasInnerB<T> = 'B' extends keyof T ? true : false;

type AHasInnerB = HasInnerB<typeof A>; // true
type CHasInnerB = HasInnerB<C>; // false

如果必须保持原有的type+namespace结构,目前TypeScript类型系统无法实现完全自动的检测,只能通过手动标记的方式间接实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:14:53