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

