如何用包装类型精准映射TypeScript接口的键值类型?
解决TypeScript接口类型的精准包装问题
你需要用**映射类型(Mapped Types)**来实现每个键的精准类型包装,而不是Record——Record会把所有值类型合并成联合,自然达不到精准映射的效果。
正确实现方式
针对你的需求,定义一个通用的包装类型,遍历原接口的每个键,对对应的值类型单独进行包装:
interface MyInterface { carrot: string; apple: { isObj: true }; } // 包装为Promise类型的通用映射 type WrapWithPromise<T> = { [K in keyof T]: Promise<T[K]>; }; // 测试使用 const myObj = {} as WrapWithPromise<MyInterface>; myObj.apple.then(data => { console.log(data); // 此时data类型为 { isObj: true },而非联合类型 }); myObj.carrot.then(data => { console.log(data); // data类型为string });
扩展到其他包装类型
同样的逻辑可以复用在Observable、Function等其他包装类型上:
// 包装为Observable类型 type WrapWithObservable<T> = { [K in keyof T]: Observable<T[K]>; }; // 包装为返回原类型的函数 type WrapWithFunction<T> = { [K in keyof T]: () => T[K]; };
为什么原来的写法不行?
你之前用的Record<keyof MyInterface, Promise<MyInterface[keyof MyInterface]>>,其中MyInterface[keyof MyInterface]会直接取原接口所有值类型的联合(也就是string | { isObj: true }),所以每个键的类型都会变成这个联合的Promise,自然无法精准对应每个键的原始类型。而映射类型会逐个处理每个键K,直接关联T[K],完美保留原接口的类型对应关系。
内容的提问来源于stack exchange,提问作者Jonathan002
相关产品推荐
相关产品推荐

