如何优化TypeScript的transform函数类型以支持可选键?
问题解决:让transform函数支持含可选键的类型
原代码中transform函数使用Record<K, V>作为输入类型约束,但Record要求所有指定的键都必须存在(必填),而包含可选键的类型(比如示例中的Foo)无法满足这个约束,导致类型报错。
优化后的类型定义:
export interface KeyValue<K, V> { key: K; value: V; } // 修改泛型约束,直接接受任意对象类型T declare function transform<T extends object>( input: T ): Array<{ [K in keyof T]: KeyValue<K, Exclude<T[K], undefined>> }[keyof T]>; interface Foo { foo: string; bar?: number; } declare const foo: Foo; const a = transform(foo); // a的类型为:Array<KeyValue<"foo", string> | KeyValue<"bar", number>>
优化说明:
- 把输入类型从
Record<K, V>改为泛型T extends object,这样可以接受任意对象类型,包括含可选键的类型。 - 返回值通过映射类型遍历
T的所有键(包括可选键),对每个键K生成对应的KeyValue<K, Exclude<T[K], undefined>>:Exclude<T[K], undefined>是为了剔除可选键自带的undefined类型,因为实际运行时只有存在的键会被转换为KeyValue元素。
- 最后通过
[keyof T]将映射类型转换为联合类型,再包裹成数组,这样返回的数组元素会是所有键对应的KeyValue类型的联合,符合实际运行逻辑。
内容的提问来源于stack exchange,提问作者Matthieu Riegler
相关产品推荐
相关产品推荐

