我正在尝试实现一个函数来选择对象的属性。功能是
const project = function<T>(object: T, projection: Projection<T>): Partial<T> {
throw new Error("not implemented yet");
};
Projection<T>
的定义是
type Projection<T> = {
[key in keyof T]?: 1 | 0
};
MongoDB project
操作之类的东西。用户可以通过{_id: 1, name: 1}
,以便我们从id
中选择name
和object
。
当我尝试创建另一个允许用户指定要投影的属性的函数时,我收到以下错误。
const project_one_property = function<T, K extends keyof T>(object: T, propertyName: K): Partial<T> {
// Type '{ [x: string]: number } is not assignable to type 'Projection<T>'.
// vvvvvvvvvv
const projection: Projection<T> = {
[propertyName]: 1
};
return project(object, projection);
};
我不知道为什么会出现此错误,因为propertyName
的类型应为key of T
而Projection<T>
允许来自T
的密钥。
我可以做些什么来使这个功能起作用。
答案 0 :(得分:1)
对于使用计算属性名称的任何对象文字,编译器似乎推断{ [x: string]: number; }
。您可以在对象文字上使用类型断言any
。或者您可以分两步初始化值:
const projection: Projection<T> = {};
projection[propertyName] = 1;