定义为[keyof T中的键]时,无法设置对象属性值

时间:2018-05-21 11:39:14

标签: typescript

我正在尝试实现一个函数来选择对象的属性。功能是

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中选择nameobject

当我尝试创建另一个允许用户指定要投影的属性的函数时,我收到以下错误。

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 TProjection<T>允许来自T的密钥。

我可以做些什么来使这个功能起作用。

1 个答案:

答案 0 :(得分:1)

对于使用计算属性名称的任何对象文字,编译器似乎推断{ [x: string]: number; }。您可以在对象文字上使用类型断言any。或者您可以分两步初始化值:

const projection: Projection<T> = {};
projection[propertyName] = 1;