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
相关产品推荐
相关产品推荐

