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

如何用包装类型精准映射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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:45:42