如何在TypeScript中修改接口所有键的类型?
解决TypeScript中克隆接口并统一修改值类型的问题
你遇到的这个需求,正好是TypeScript映射类型的拿手场景!你已经找到了解决思路,其实还可以把写法优化得更清晰、更复用~
你的可行方案回顾
你直接在变量类型里写{ [key in keyof IValues]: boolean }已经能解决类型错误的问题,这个写法本质上就是手动实现了一个映射类型:
const fun = <IValues>(values: IValues) => { // 处理值以初始化valuesModified1和valuesModified2 const originalValues: IValues = valuesModified1; // {a: 'foo', b: 'bar'} const modifiedValues: { [key in keyof IValues]: boolean } = valuesModified2; // {a: true, b: false} return {originalValues, modifiedValues}; };
更优雅的复用写法
如果以后需要多次用到这种“保留原键、替换值类型”的转换,建议把这个映射逻辑提取成一个可复用的泛型类型,代码可读性和维护性会更好:
// 定义通用转换类型:接收原类型T,返回键相同、值为boolean的新类型 type MapValuesToBoolean<T> = { [K in keyof T]: boolean }; const fun = <IValues>(values: IValues) => { // 处理值以初始化valuesModified1和valuesModified2 const originalValues: IValues = valuesModified1; const modifiedValues: MapValuesToBoolean<IValues> = valuesModified2; return {originalValues, modifiedValues}; };
原理说明
映射类型[K in keyof T]会自动遍历原类型T的所有键,然后将每个键对应的值类型替换成你指定的类型(这里是boolean)。这种方式完全满足你“克隆接口并修改所有键类型”的需求,而且TypeScript会严格保证键的一致性——如果原接口新增或删除键,转换后的类型会自动同步,不会出现类型不匹配的问题。
要是以后需要把值类型改成number或者其他类型,只需要修改MapValuesToBoolean里的类型定义就行,非常灵活。
内容的提问来源于stack exchange,提问作者termitavee
相关产品推荐
相关产品推荐

