TypeScript如何包装接口属性?区分类型使用不同泛型类
解决方案
先定义一个用来识别原始类型的辅助类型:
type Primitive = string | number | boolean | null | undefined | symbol | bigint;
接着实现能区分原始类型/非原始类型的包装类型:
type FromInterface<I> = { [K in keyof I]: I[K] extends Primitive ? MyGeneric<I[K]> : MyGenericContainer<I[K]>; };
现在用这个类型处理你的接口:
type ISomeWrappedInterface = FromInterface<ISomeInterface>;
生成的类型完全符合需求:原始类型属性用MyGeneric包装,非原始类型(比如ISomeOtherInterface)用MyGenericContainer包装。
原代码错误说明
你之前的代码里MyGeneric<typeof T>是错误的,原因是:
T(换成K语义更准确)是keyof I的类型,也就是属性名的类型(比如"propertyA"),它本身已经是类型,不能用typeof操作符(typeof用于获取值的类型,而非类型的类型)。- 要获取属性对应的类型,应该用
I[K]访问接口I中键K对应的类型。
内容的提问来源于stack exchange,提问作者Hafnernuss
相关产品推荐
相关产品推荐

