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

TypeScript如何将any/unknown类型属性映射为泛型类型T

TypeScript 实现any/unknown属性映射为指定泛型的方案

你的思路是对的,核心是通过映射类型遍历原对象属性,搭配自定义类型判断逻辑识别any/unknown类型后做替换,具体实现如下:

前置类型判断工具

TS没有内置的any/unknown类型判断能力,需要利用类型系统特性自行实现:

  • IsAny:利用any的特殊交叉特性判断,只有any和任意类型交叉后仍为any,满足0 extends any的规则,不会和其他类型产生误判
type IsAny<T> = 0 extends (1 & T) ? true : false;
  • IsUnknown:unknown是顶层类型,只有any和unknown满足unknown extends T,排除掉any的场景后即可精准识别unknown
type IsUnknown<T> = unknown extends T
  ? IsAny<T> extends true ? false : true
  : false;

核心映射类型

遍历原类型的所有键,对属性值做判断,是any/unknown就替换为传入的泛型T,其余属性保留原有类型:

type ReplaceAnyUnknown<Source extends object, T> = {
  [Key in keyof Source]: IsAny<Source[Key]> extends true
    ? T
    : IsUnknown<Source[Key]> extends true
      ? T
      : Source[Key]
};

用法示例

对应你给出的场景,直接传入非泛型原类型即可生成需要的泛型结构:

// 原非泛型类型定义
type TypeNonGeneric = { prop1: any, prop2: string };
// 生成目标泛型类型
type TypeGeneric<T> = ReplaceAnyUnknown<TypeNonGeneric, T>;

// 类型验证:TypeGeneric<number> 的结构为 { prop1: number, prop2: string },完全匹配预期

补充说明:如果属性是包含any/unknown的联合类型(比如prop: string | unknown),该工具也会识别并替换,和TS原生类型分发逻辑保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:27:17