如何在TypeScript单个类型中使用两个映射类型?
实现合并多接口映射类型的替代方案
已知你定义了两个接口:
interface A { a: boolean; b: boolean; } interface X { x: number[]; }
想要创建OneType将A的所有键映射为number,X的所有键映射为string,直接在单个类型字面量里写两个映射类型的语法确实不被TypeScript支持。除了拆分映射类型再交叉的方式,还有两种更简洁的实现方法:
方法一:内联映射类型+交叉类型
不用单独定义中间映射类型,直接把两个映射逻辑写在交叉类型里:
type OneType = { [K in keyof A]: number } & { [K in keyof X]: string }; const map: OneType = { a: 22, b: 223, x: '343' };
方法二:联合键+条件类型
把A和X的键合并成联合类型,再通过条件判断为不同键分配对应类型:
type OneType = { [K in keyof A | keyof X]: K extends keyof A ? number : string; }; const map: OneType = { a: 22, b: 223, x: '343' };
补充说明
TypeScript不允许在单个对象类型字面量中存在多个映射类型条目,这就是你直接写两个[key in ...]语法失效的原因。上面两种方法本质上都是绕开这个限制:要么把多个映射拆成独立类型再交叉,要么把所有键合并后用条件类型分支处理。
内容的提问来源于stack exchange,提问作者zucker
相关产品推荐
相关产品推荐

