TypeScript如何基于已有接口键生成键值对数组的类型接口
你已经定义了通用的KeyValue结构,我们可以基于它写一个泛型工具类型,直接把任意对象类型转换为对应键值对数组:
// 基于你已有的KeyValue类型扩展 type KeyValueArray<T> = Array<{ [K in keyof T]: KeyValue<K, T[K]> }[keyof T]>
接下来替换CarRequest里的features类型即可,不需要手动枚举键:
interface CarRequest { manufacturer: string; model: string; // 直接传入Features类型,自动生成对应的键值对数组类型 features?: KeyValueArray<Features> }
处理函数部分,因为TS原生的Object.entries会把键的类型放宽为string,我们加个类型断言确认类型即可,逻辑上完全安全:
function prepareCarRequest(car: Car): CarRequest { return { manufacturer: car.manufacturer, model: car.model, features: Object.entries(car.features).map(([key, value]) => ({ key, value })) as KeyValueArray<Features> }; }
实现后这个类型会自动同步Features接口的所有修改:如果你之后给Features新增/删除字段,或者修改某个字段的类型,CarRequest['features']的类型会自动更新,不需要手动调整。同时会做严格的类型校验:手动构造features元素时,key只能是wheels/color/packages三个合法值,value的类型也会和对应键的定义完全匹配。
内容的提问来源于stack exchange,提问作者ilya
相关产品推荐
相关产品推荐

