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

如何定义NotNominal类型,识别TypeScript非品牌化类型?

如何定义NotNominal<U>类型过滤品牌化类型

我们先有如下品牌化类型的定义:

declare const nominalSymbol: unique symbol;
type Nominal<T extends string, U> = U & { [nominalSymbol]: T };

现在需要实现一个NotNominal<U>类型,满足:

  • 当U不是品牌化类型时,解析结果为U本身
  • 当U是品牌化类型时,解析结果为never

示例期望效果:

type BrandedType = Nominal<'Address', string>;

type a = NotNominal<string> // 应解析为 string
type b = NotNominal<BrandedType> // 应解析为 never

实现方案

可以通过条件类型结合唯一符号的索引访问来实现,代码如下:

declare const nominalSymbol: unique symbol;
type Nominal<T extends string, U> = U & { [nominalSymbol]: T };

type NotNominal<U> = U extends { [nominalSymbol]: unknown } ? never : U;

// 验证示例
type BrandedType = Nominal<'Address', string>;

type a = NotNominal<string> // 结果:string
type b = NotNominal<BrandedType> // 结果:never

逻辑说明

这个实现的核心思路很直接:

  • 利用TypeScript的条件类型,检查U是否能匹配{ [nominalSymbol]: unknown }这个类型约束
  • 因为我们定义的品牌化类型是基础类型 + 带有nominalSymbol属性的对象的交集,所以所有品牌化类型都会满足这个约束
  • 若匹配成功(即U是品牌化类型),返回never;否则返回原类型U

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:40:57