【发布时间】:2022-11-04 19:37:37
【问题描述】:
我试图通过仅过滤一个属性来创建一个通用函数来转换对象 - 沿着以下几行:
function pickOnePropertyUntyped(data: any, key: any): any {
return {
[key]: data[key]
}
}
因此,期望的行为是:
const a: A = {
a: 'a',
b: 1
}
const r = pickOnePropertyUntyped(a, 'a'); // {'a': 'a'}
我在获取所需类型和实现方面遇到问题。
我的尝试是:
type UnionToIntersection<U> =
(U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never
type NoUnion<Key> =
[Key] extends [UnionToIntersection<Key>] ? Key : never;
type PickOneProperty<T, P extends keyof T & string> = {
[K in keyof T as K extends NoUnion<P> ? K : never]: T[K]
}
function pickOneProperty<T, K extends keyof T & string>(
data: T,
key: K,
): PickOneProperty<T, K> {
return {
[key]: data[key]
}
}
哪个:
- 正确地将输入属性限制为一个键(我使用了Is there a way to prevent union types in TypeScript?)
- 正确推断输出类型
不幸的是,它将返回类型标记为不正确。
【问题讨论】:
标签: typescript