我可以使用Typescript泛型根据类型从对象中过滤键吗?



我有一个过滤器函数在工作,但是我无法找到如何编写一个泛型类型来传达这个返回的数据结构:

class Value<T> {
val: T;
constructor(val: T){
this.val = val;
}
get(): T {
return this.val;
}
}
let data = {
foo: new Value(123),
bar: new Value('abc'),
baz: 'xyz'
}
let filter = (obj: Object): any => {
let result: any = {};
for (const [key, val] of Object.entries(obj)) {
if(val instanceof Value) result[key] = val.get();
}
return result;
};
filter(data).foo; // 123
filter(data).bar; // 'abc'
filter(data).baz; // error
我已经设法用泛型做了一些有点复杂的事情,但我认为这超出了我的深度。如有任何帮助,我将不胜感激。

我想这就是你要找的:

TS Playground链接

type Filtered<T> = {
[K in keyof T as T[K] extends Value<any> ? K : never]: T[K] extends Value<any>
? ReturnType<T[K]['get']>
: never;
};
function filter<T extends Record<string, unknown>>(obj: T): Filtered<T> {
const result = {} as Filtered<T>;
for (const [key, val] of Object.entries(obj)) {
if (val instanceof Value) result[key as keyof typeof result] = val.get();
}
return result;
}

最新更新