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

如何将TypeScript中User类型的ID类型传播至其他关联类型?

如何让多个TypeScript类型共享同一泛型ID类型且无需重复定义?

要实现只在一处定义User ID类型,让所有相关类型自动同步该类型,避免每个类型都手动添加泛型参数,可以试试以下几种方案:

方案1:全局共享基础类型别名

最直接的方式是先定义一个全局的ID类型别名,所有相关类型都直接引用它。如果需要切换ID类型,只修改这一处即可:

// 全局定义ID类型,默认用string,开发者可根据需求改成number等
type BaseUserId = string;

// User类型直接使用BaseUserId
type User = {
  id: BaseUserId;
};

// 其他类型同样引用BaseUserId,自动同步类型
type AnotherType = {
  userId: BaseUserId;
};

// 若要切换为数字ID,只需修改BaseUserId:
// type BaseUserId = number;

这种方案适合不需要动态切换多种ID类型的场景,配置简单,全局统一修改即可。

方案2:用泛型工具类型提取User的ID类型

如果需要支持动态切换ID类型(比如同时存在字符串ID和数字ID的User),可以通过工具类型提取User的id字段类型,让其他类型自动同步:

// 泛型User类型,默认ID为string
type User<T = string> = {
  id: T;
};

// 工具类型:提取任意User类型中的id类型
type GetUserId<TUser> = TUser extends { id: infer U } ? U : never;

// AnotherType自动同步传入的User类型的id类型,默认使用User<string>
type AnotherType<TUser extends User = User> = {
  userId: GetUserId<TUser>;
};

// 使用示例
// 默认情况:userId为string
type DefaultAnother = AnotherType;

// 数字ID场景:先定义数字类型的User,再传入AnotherType
type NumericUser = User<number>;
type NumericAnother = AnotherType<NumericUser>; // userId自动为number

这种方案的优势是灵活性高,只需定义一次GetUserId工具类型,所有需要同步ID类型的结构都可以复用它,无需每个类型都单独声明泛型参数。

为什么之前的尝试行不通?

你之前尝试直接引用UserIdType或用getType(User.id)是因为:泛型参数只在泛型类型的作用域内有效,外部无法直接访问;而typeof和ReturnType这类工具只能作用于具体的值或函数,无法直接提取泛型类型的字段类型——必须通过infer关键字在条件类型中提取泛型字段的类型,这也是方案2的核心原理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:41:14