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

TypeScript条件类型:如何精确匹配unknown而非判断继承关系

实现精确匹配unknown的TypeScript类型TEST

在TypeScript中,普通的条件类型T extends unknown会匹配所有类型——因为unknown是顶级类型,任何类型都可以赋值给它。要实现仅当T精确等于unknown时返回number,否则返回boolean的需求,需要测试类型的精确相等性而非继承关系。

解决方案1:双向条件判断

通过同时判断T extends unknown和unknown extends T来实现精确匹配:

type TEST<T> = T extends unknown ? (unknown extends T ? number : boolean) : boolean;

测试结果:

type T1 = TEST<unknown>; // number(符合预期)
type T2 = TEST<string>; // boolean(符合预期)
type T3 = TEST<any>; // number(若需排除any,见方案2)

解决方案2:通用精确相等判断工具类型

如果需要严格区分unknown和any,可以先定义一个通用的Equals类型,利用TypeScript泛型的逆变特性实现精确类型相等检测:

// 精确类型相等判断工具
type Equals<X, Y> =
  (<T>() => T extends X ? 1 : 2) extends
  (<T>() => T extends Y ? 1 : 2) ? true : false;

// 基于Equals实现TEST类型
type TEST<T> = Equals<T, unknown> extends true ? number : boolean;

测试结果:

type T1 = TEST<unknown>; // number(符合预期)
type T2 = TEST<string>; // boolean(符合预期)
type T3 = TEST<any>; // boolean(排除了any的情况)
type T4 = TEST<unknown | string>; // boolean(联合类型也会被正确识别)

原理说明

  • 方案1的双向判断:只有当T和unknown互相可赋值时,才认为二者精确相等(但any会满足unknown extends any,所以无法区分unknown和any)。
  • 方案2的Equals类型:通过比较两个泛型函数的类型兼容性,只有当X和Y完全相同时,两个函数类型才会被视为相等,从而实现最严格的精确类型匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:07:08